diff --git a/src/learn_linux_basic/file_and_path/manage_file_premissons.md b/src/learn_linux_basic/file_and_path/manage_file_premissons.md new file mode 100755 index 0000000..7e7414a --- /dev/null +++ b/src/learn_linux_basic/file_and_path/manage_file_premissons.md @@ -0,0 +1,267 @@ +# 文件权限管理 + +## 用户?用户组? + +### 多用户操作系统的概念 + +不同于Windows这种基本上是单用户的操作系统,而Linux这种Unix-like系统因为是集成了Unix概念的原因,所以是实打实的多用户多任务分时操作系统。 + +Unix刚发明的时候,电脑十分笨重且昂贵,一台电脑不可能让一个用户独占,必须同时分给多个用户使用。即便是最基本的电脑也能分出32个终端同时使用。这时候,完善的用户与权限的管理就是十分必要的了。 + +Unix-like 系统的用户被组织成了一个类树状结构,看起来就像这样: + +```text +All Users + |- root + | |- root + | + |- wheel + |- manager1 + |- user1 +``` + +### UID & GID + +每个用户都有一个独一无二的编号,称作`UID`。每个用户组也有一个独一无二的编号,称为`GID`。 + +Unix-like使用UID而不是用户名区分用户,如果你试着把两个账户的UID互相调换,你会神奇的发现,这两个用户的权限和所拥有的文件也被互换了。 + +UID的各个号段都已经被预先分配好了,分配如下:- 0 root,权限最高的用户 - 1-999 系统服务保留UID,下分两种 - 1-200 发行版自带软件所需帐号的UID - 201-999 用户自行创建的(或用户所安装软件创建的)账户的UID - 1000-60000 普通账户 + +除了root意外,其他账户的权限基本没有区别。 + +GID基本就是用户组的ID,此处不再赘述。 + +### `/etc/passwd` + +所有用户的列表存储在`/etc/passwd`中,这个文件在传统的Unix系统中同样存储所有用户的密码,但是现在密码的存储已经分到了`/etc/shadow`中,让我们一起来看看这个两个文件的结构吧。 + +当你通过命令查看`/etc/passwd`的内容时,你应该会看到类似下面的内容: + +```text +root:x:0:0:root:/root:/bin/bash +bin:x:1:1:bin:/bin:/sbin/nologin +// ... +hmtsai:x:1000:1000:hmtsai:/home/hmtsai:/bin/bash +vboxadd:x:979:1::/var/run/vboxadd:/bin/false +``` + +> 注:查看文件更推荐使用`cat`命令,而不是各类编辑器,因为有些文件在被写入之后会出一些问题。 + +这个文件每行分为几个部分,格式如下: + +```text +用户名:密码:UID:GID:其他信息:家目录位置:登录Shell +``` + +密码字段现在有三种可能性:- `x`表示密码在`/etc/shadow`中 - 留空表示密码为空,无需密码即可登录 - `!`表示该账户已经被禁用,无法登录 + +其他信息默认存储用户名,这个也可以存储其他信息,但是现在很少用到。 + +登录Shell指的是该账户登录后执行的程序,默认为`/bin/bash` + +你可能会发现,有的用户的登录Shell是`/bin/nologin`或`/bin/false`,这代表这些用户不能登录。 + +> 你可以在终端里面执行`nologin`,会发现他会提示“该用户无法登录”,而`false`只是简单地返回一个错误返回值。 + +> 有关Shell的知识我们在后面会系统介绍,简单来说,Shell就是一个让用户交互来执行操作的程序。 + +### root用户 + +root,顾名思义,就是“根”,它代表了Unix-like系统中的最高权限,他的UID是0,因为他是Unix-like系统中的第一个用户。 + +root有的时候也被称为“超级用户”,这更表明了root在Unix-like系统中最高权限的地位。 + +> 虽然用root进行操作很方便,但是我们还是更推荐使用其他的普通用户,避免误操作导致系统GG。 + +## 所有者?同用户组?其他人? + +### 所有者 + +文件的所有者默认是创建文件的人,一般来说也是对文件有最大权限的人。 + +所有者权限意义在于,你可以把像日记本这种较为隐私的信息设置为仅可自己读写,其他人只有读取的权限,这样就能达到防止篡改的目的。 + +### 同用户组 + +同用户组的权限设置在协同工作的时候比较有用,比如共同开发一个项目,我们就可以将这个项目文件夹的文件的权限设置为同用户组可以读写,这样就可以方便共同开发。 + +### 其他人 + +字面意思,不再赘述。 + +但是,由于`root`是系统的最高权限,所以`root`对所有文件都拥有读写的权限。 + +## 文件管理命令 + +### `ls`命令 + +之前对于`ls`只是简单介绍,接下来,我们将要仔细介绍`ls`的各个常用参数。 + +- `-a`参数,a就是all的意思,代表输出所有文件,包括隐藏文件。 +- `-l`参数,l是long list的意思,即长列表。 + + 输出类似下面这样。 + + ```text + 总计 96 + drwxr-xr-x 2 hmtsai hmtsai 4096 7月 4日 09:49 公共 + drwxr-xr-x 2 hmtsai hmtsai 4096 7月 4日 09:49 模板 + drwxr-xr-x 3 hmtsai hmtsai 4096 7月 9日 10:38 视频 + drwxr-xr-x 3 hmtsai hmtsai 4096 7月15日 20:03 图片 + drwxr-xr-x 4 hmtsai hmtsai 4096 7月10日 13:32 文档 + drwxr-xr-x 2 hmtsai hmtsai 4096 7月16日 19:20 下载 + drwxr-xr-x 2 hmtsai hmtsai 4096 7月 4日 09:49 音乐 + drwxr-xr-x 2 hmtsai hmtsai 4096 7月 4日 09:49 桌面 + ``` + +- `-d`参数,d表示direoctry,表示仅列出目录(不列出目录中的文件)。 + +### `less`命令 + +`less`用来分页查看文件内容,它从标准输入流或者指定的文件读入内容,然后分页在屏幕上显示。 + +> 什么是标准输入流呢?实际上就是`/dev/stdin`这个文件而已,与之对应的有标准输出和标准错误,分别是`/dev/stdout`和`/dev/stderr`. + +### `chown`命令 + +chown命令光看名字就知道他是干什么的,ch就是change嘛,own自然就是owner,所有者嘛。连起来,就是修改所有者的意思啦! + +但是,光知道是干什么的可没有用,要想真正的用起来,还得知道这命令的格式之类的,接下来我们就来介绍一些常用的格式和参数吧! + +```text +用法:/usr/bin/chown [选项]... [所有者][:[组]] 文件... +``` + +也就是如果我想要吧一个名叫`foo`的文件的所有者变为`wheel`组的`hmtsai`,我就得执行下面的命令: + +```sh +chown hmtsai:wheel foo +``` + +如果你不想关心用户组的话,也可以直接执行: + +```sh +chown hmtsai foo +``` + +`chown`这命令还有一些比较有意思的参数: + +#### `-R`:递归操作文件或目录 + +> 首先,在主目录创建一些文件,来让我们继续学习这些命令。 +> +> ```sh +> mkdir foo1 +> cd foo1 +> touch bar1 +> mkdir test_chown +> cd test_chown +> touch bar2 +> touch bar3 +> ``` +> +> 接下来,返回家目录: +> +> ```sh +> cd ~ +> ``` + +指定`-R`选项后,将会遍历目录下的每一个文件(包括子目录下的文件),并执行指定的操作。 + +#### `-v`(`--verbose`)打印出更详细的信息 + +`-R`选项一般配合`-v`选项使用,毕竟递归操作属于较为危险的操作,最好保留详细的日志信息。 + +让我们观察一下这些选项会导致的结果,比如把这些文件和目录的所有者从`hmtsai`组的`hmtsai`改为`wheel`组的`hmtsai`用户试试? + +```sh +chown -Rv hmtsai:wheel foo1 +``` + +你将看见以下输出信息: + +```text +'foo1/bar1' 的所有者已从 hmtsai:hmtsai 更改为 hmtsai:wheel +'foo1/test_chown/bar3' 的所有者已从 hmtsai:hmtsai 更改为 hmtsai:wheel +'foo1/test_chown/bar2' 的所有者已从 hmtsai:hmtsai 更改为 hmtsai:wheel +'foo1/test_chown' 的所有者已从 hmtsai:hmtsai 更改为 hmtsai:wheel +'foo1' 的所有者已从 hmtsai:hmtsai 更改为 hmtsai:wheel +``` + +> 与`chown`命令类似的还有`chgrp`命令,不过专门用于修改文件的用户组属性,这里不再赘述,可以通过`chgrp --help`来查看详细的用法。 + +### `chmod` 命令 + +`chmod`命令用于修改文件的“模式”(可以直接理解为权限)。主要有两种用法: + +1. `chmod [选项]... 模式[,模式]... 文件...` +2. `chmod [选项]... 八进制模式 文件...` + +#### 普通模式格式 + +第一种用法中的“模式”由三个部分组成,如下表: + +|操作对象|操作|权限| +|--------|--------|--------| +|u,g,o|+,-|r,w,x| + +这里面的u代表user(所有者),g代表group(同用户组),o代表others(其他人)。操作无非就是两种——增加和减少。权限三种:读取,写入,执行。 + +> 文件的执行很好理解,但是目录的执行权限就比较特殊了,它代表的是“用户进入目录的权限”。但是不能进入目录不代表用户不能访问目录中的文件,用户仍然可以通过完整的路径访问文件就是了。 + +比如,我想要把`foo1`目录的权限设置为仅文件所有者可以执行、读取和写入,我们可以使用如下命令: + +```sh +chmod go-rwx foo1 +``` + +这时候再使用`ls -l`命令查看`foo1`目录的权限就可以看到g,o的所有权限都被取消了: + +```text +drwx------ 3 hmtsai wheel 4096 7月26日 18:33 foo1 +``` + +接下来让我们考虑一个其他场景——如果我需要为不同的用户类别设置不同的权限怎么办?`chmod`的开发者们也考虑到了这个问题,于是我们可以通过逗号同时设置多个类别用户的权限。 + +比如,让`foo1`文件夹同用户组可以读写进入,其他人只可读取进入怎么样? + +```sh +chmod g+rwx,o+rx foo1 +``` + +再用`ls -l`命令去看,`foo1`目录的权限又变化了: + +```text +drwxrwxr-x 3 hmtsai wheel 4096 7月26日 18:33 foo1 +``` + +> 有些眼尖的同学可能会发现,目录的权限前面多了一个`d`,这是代表该权限所对应的是目录的象征,是`direoctry`的简写,很多软件也是这样区分目录和文件的! + +#### 八进制模式格式 + +其实八进制模式也不是很难,只不过每个权限变成了三个数字相加的和,如下表所示: + +|r|w|x| +|-|-|-| +|4|2|1| + +八进制模式主要用于快速修改模式。比如,我想让一个文件的模式变成rwxrwxrwx,只需要`chmod 777 file`,而不是`chmod ugo+rwx file`。 + +> 为什么是4,2,1这三个数字呢?这是因为他们的组合能够不重,不信你试试看。 + +> 还有一个比较有意思的格式叫做“参考模式”,非常简单,格式就是`chmod [选项]... --reference=参考文件 文件...`。这个主要在懒得看模式的时候用(划掉)。因为比较简单,所以这里不再赘述。 + +#### 参数 +`chmod`的参数与`chown`比较类似,于是在此不再赘述,详情可以通过`chmod --help`了解。 + +> 几乎所有命令都有一个`--help`参数,可以通过这个参数大概了解这个命令的用法。 + + +# 课后任务 + +由于这篇的内容比较复杂,于是我们建议您完成以下任务进行练习: + +- 将`foo1`文件夹的权限设置为`drwxrwxrwx`,并将完整日志打印到屏幕上。 +- 将`test_chown`目录下的所有文件的权限设置为`755`,并且解释`755`在这里的含义,然后给出功能相同的使用字符模式的命令。 +- 递归删除`foo1`文件夹,并且打印出`rm`命令每一步的操作。(可以参考`rm`命令的手册或者`rm --help`命令的输出) diff --git a/src/learn_linux_basic/linux_common_sense.md b/src/learn_linux_basic/linux_common_sense.md index 4bcc5a4..254d56d 100755 --- a/src/learn_linux_basic/linux_common_sense.md +++ b/src/learn_linux_basic/linux_common_sense.md @@ -163,4 +163,4 @@ sudo poweroff ### `man`用户手册 -man,是manual(手册)的意思,你可以通过简单地输入 `man >:>`:: +man,是manual(手册)的意思,你可以通过简单地输入 `man <命令>`来使用。