Skip to content

Commit 2fe6521

Browse files
committed
Ch05 to Ch06 (partial) modifications, and add some content
1 parent 7d52cd5 commit 2fe6521

File tree

4 files changed

+45
-6
lines changed

4 files changed

+45
-6
lines changed

docs/Ch03/index.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,7 @@ Ubuntu 官方源位于国外,往往会有速度与延迟上的限制,可以
441441
bin include lib libexec share
442442
```
443443

444-
一般而言,软件的可执行文件都位于 bin 目录下:
444+
一般而言,软件的可执行文件都位于 `bin` 目录下:
445445

446446
```shell
447447
$ cd bin

docs/Ch05/index.md

+9-3
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ icon: material/account-group
6464

6565
!!! danger "谨慎使用 `root` 用户权限执行命令!"
6666

67-
我们知道,`root` 用户可以对系统做极其危险的操作。当使用 `root` 权限执行命令时(如使用 `sudo`),一定要**小心、谨慎,理解命令的含义之后再按下回车**。**请不要复制网络上所谓的「Linux 优化命令」等**,以 `root` 权限执行,否则**可能会带来灾难性的后果**。
67+
我们知道,`root` 用户可以对系统做极其危险的操作。当使用 `root` 权限执行命令时(如使用 `sudo`),一定要**小心、谨慎,理解命令的含义之后再按下回车**。**请不要复制网络上所谓的「Linux 优化命令」等**,以 `root` 权限执行,否则**可能会带来灾难性的后果**。除了复制外,直接通过 `curl` 等工具获取脚本然后通过管道传给 `sh` 执行也是非常危险的操作。运行脚本前,请务必先仔细检查要执行的脚本内容。
6868

6969
以下是一些会对系统带来<span class=red>毁灭性破坏</span>的例子。 **<span class=red>再重复一遍,不要执行下面的命令!</span>**
7070

@@ -126,7 +126,7 @@ uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup)
126126

127127
??? example "修改 `sudo` 配置的例子:无密码执行 `sudo` (\*)"
128128

129-
`sudo` 的配置存储在 `/etc/sudoers` 文件中,仅 `root` 用户有权查看和修改。**不要直接修改此文件。**对这个文件的任何修改,都应该使用 `visudo` 这个命令去做
129+
`sudo` 的配置存储在 `/etc/sudoers` 文件中,仅 `root` 用户有权查看和修改。**不要直接修改此文件对这个文件的任何修改,都应该使用 `visudo` 这个命令完成**
130130

131131
默认的 Ubuntu 配置中,安装时创建的用户在 `sudo` 用户组(下文会提到这个概念)中。在 `sudoers` 文件中,它的配置像这样:
132132

@@ -311,6 +311,8 @@ drwxrwxr-x 2 ustc ustc 4096 Feb 3 22:38 a_folder
311311
(可以执行了)
312312
```
313313

314+
再次强调,**在运行任何来自网络的程序或脚本前,请先检查其内容**,特别是使用高权限的用户执行时。
315+
314316
## 文件系统层次结构 {#fhs}
315317

316318
相信到现在你应该已经发现了:Linux 下文件系统的结构和 Windows 的很不一样。在 Windows 中,分区以盘符的形式来标识(如「C 盘」、「D 盘」),各个分区的分界线是很明确的。在系统所在的分区(一般为 C 盘)中,存储着程序文件 (`Program Files`),系统运行需要的文件 (`Windows`),用户文件 (`Users`) 等。这种组织形式源于 DOS 和早期的 Windows,并一直传承下来。
@@ -414,7 +416,7 @@ drwxrwxr-x 2 ustc ustc 4096 Feb 3 22:38 a_folder
414416
: 存储会发生变化的程序相关文件。例如下面的目录:
415417

416418
- `/var/log`:存储程序的日志文件。
417-
- `/var/lib`:存储程序自身的状态信息(如 lock file)。
419+
- `/var/lib`:存储程序自身的状态信息(如 lock file)。这个目录和 `library` 的关系并不大。
418420
- `/var/run`:存储程序运行时的数据(部分发行版会将该目录符号链接到 `/run` 目录)。
419421
- `/var/spool`:存储「等待进一步处理」的程序数据。
420422

@@ -440,6 +442,10 @@ drwxrwxr-x 2 ustc ustc 4096 Feb 3 22:38 a_folder
440442

441443
当需要浏览仅 `root` 用户可查看的目录时,很多人的第一反应是 `sudo cd xxx`,但最终失败了。尝试解释这样做不可行的原因。
442444

445+
!!! question "普通用户运行 `reboot`"
446+
447+
前面说过,`reboot` 这类程序只能由 `root` 用户运行。为何普通用户在 Shell 中直接输入 `reboot` 不行?
448+
443449
## 引用来源 {#references .no-underline}
444450

445451
- [维基百科上的 Passwd 词条(英语)](https://en.wikipedia.org/wiki/Passwd)

docs/Ch05/solution.md

+27-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ icon: material/tooltip-question
2222

2323
??? info "解答"
2424

25-
```
25+
```shell
2626
$ /usr/sbin/nologin
2727
This account is currently not available.
2828
$ /bin/false
@@ -62,11 +62,36 @@ icon: material/tooltip-question
6262

6363
如果你真的去执行 `sudo cd`,那么会看到:
6464

65-
```
65+
```shell
6666
$ sudo cd a
6767
sudo: cd: command not found
6868
```
6969

7070
这是因为,`cd` 是 shell 的**内建命令**,而不是某个具体的程序,而 `sudo` 的功能,是以其他用户 (一般是 root) 的身份执行程序。
7171

7272
那么 `cd` 可以实现成(外置的)程序吗?答案是不能:因为切换工作目录的系统调用 (`chdir()`) 只能切换当前的程序的工作目录。如果实现成了外置的程序,那么切换完退出之后,shell 的工作目录仍然不会变化。
73+
74+
## 普通用户运行 `reboot`
75+
76+
??? info "解答"
77+
78+
这里可不止权限不足的问题。事实上,用普通用户执行 `reboot`,你会看到:
79+
80+
```shell
81+
$ reboot
82+
-bash: reboot: command not found
83+
```
84+
85+
这是为什么呢?这是因为,`reboot` 存在于 `/sbin` 下,而这个目录并不在普通用户登录后默认的 `PATH` 环境变量中。也就是说,Shell 并不会去 `/sbin` 中查找 `reboot`,自然就会提示 `command not found`。如果执行
86+
87+
```shell
88+
$ /sbin/reboot
89+
```
90+
91+
或者
92+
93+
```shell
94+
$ systemctl reboot -i # 另一种重启的方法
95+
```
96+
97+
就会因为有其他用户已登录,或者权限不足而失败。其他的命令也是类似的原因,只能由 `root` 执行。

docs/Ch06/index.md

+8
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,10 @@ cURL (`curl`) 是一个利用 URL 语法在命令行下工作的文件传输工
166166
$ curl -I "http://cn.bing.com"
167167
```
168168

169+
!!! warning "关于从 Internet 获取的脚本"
170+
171+
直接通过 `curl` 或者 `wget` 等工具从 Internet 获取脚本然后通过管道传给 `sh` 执行是非常危险的操作。运行脚本前,请确保脚本是从正确的地址下载的,并仔细检查要执行的脚本内容。
172+
169173
### 其他 {#download-others}
170174

171175
除了 Wget、cURL,还有 mwget(多线程版本 wget)、Axel、Aria2(支持 BT 协议、支持 JSON-RPC 和 XML-RPC 接口远程调用)之类下载工具,其中 Aria2 在 Windows 下使用也很广泛。
@@ -334,6 +338,10 @@ drwxr-xr-x 2 ustc ustc 4096 11月 17 20:45 模板/
334338

335339
部分 shell 会自带一些 alias,例如 [fish 中的 `ll` 就是 `ls -lh` 的别名](https://github.com/fish-shell/fish-shell/blob/daf96a35b57f52eea19302f615283e7c1486ab8c/share/functions/ll.fish#L5)。特别地,Windows 自带的 PowerShell 中的 alias 存在一些争议,例如其对 `curl` 的 alias 实际上是 `Invoke-WebRequest`,而这个命令和上文介绍的 curl 的行为完全不同,给用户带来了困惑。
336340

341+
!!! warning "alias 可能带来的问题"
342+
343+
如果将常见命令(例如 `cat`)通过 alias 映射到包含恶意代码的可执行文件上,则可能导致这些恶意代码被意外地执行。
344+
337345
### Bash 脚本的运行 {#run-bash-script}
338346

339347
可以使用几种方法运行 Bash 脚本:

0 commit comments

Comments
 (0)