首页 > > > Linux 一切皆文件
本文借着 Linux 下那句著名的“Linux 一切皆文件”,讲解一下 Linux 下文件的权限和 root 用户,普通用户,什么是用户组等。
提起 Linux,我想大家都听说过这句话:Linux 一切皆文件。那它是什么意思呢?我们一起来看看吧。
上面列举了一些 Linux 系统中常见的文件,还是那句话,Linux 一切皆文件,只要你能感知到的,在 Linux 上都是被抽象成文件了的。
了解我 Linux 一切皆文件后,我们再来学习几个重要的知识点。
我们在使用一些命令的时候,shell 可能会提示我们没有权限访问。从使用 Linux 系统到现在,你一定遇到过下图中类似的提示。

其实这些提示的意思就是作为一个普通用户,没有权限来读取这些文件。那权限到底是个什么东西呢?先别急,听我慢慢道来。
一个用户可以拥有文件和目录。当一个用户拥有一个文件或目录时, 用户对这个文件或目录就有访问权限和控制权限。用户又会属于一个由一个或多个用户组成的用户组,用户组成员对这些文件和目录的权限由文件和目录的所有者授予。除了对一个用户组授予权限之外,文件所有者可能会给其他用户或者用户组成员一些权限。

上图展示了 id 命令的使用和输出结果,从输出结果中,我们能获取到一些重要的信息。
在这里用户是 eg,用户数组是 eg,其他就很多了,有 adm、cdrom、sudo 等等。
对于文件和目录的访问权力是根据读访问、写访问和执行访问来定义的。我们来看看 ls -l test.txt 这个命令的执行结果(注意:test.txt 是我自己创建的一个文件,你可以把它换成你自己的文件)。

这行内容的前十个字符是文件的属性。这十个字符的第一个字符表明文件类型。下表是经常看到的文件类型(还有其它的,不常见类型):
-:普通文件d:目录l:符号链接。注意对于符号链接文件,剩余的文件属性总是 "rwxrwxrwx",而且都是虚拟值。真正的文件属性是指符号链接所指向的文件的属性c:字符设备文件。这种文件类型是指按照字节流来处理数据的设备。 比如说终端机或者调制解调器b:块设备文件。这种文件类型是指按照数据块来处理数据的设备,例如一个硬盘或者 CD-ROM 盘剩下的九个字符叫做文件模式,代表着文件所有者、文件组所有者和其他人的读、写和执行权限。
当设置文件模式后,r、w和x 模式属性对文件和目录会产生以下影响:
cd directory
下面是权限属性的一些例子:
-rwx------:一个普通文件,对文件所有者来说可读、可写、可执行。其他人无法访问-rw-------:一个普通文件,对文件所有者来说可读可写。其他人无法访问-rw-r--r--:一个普通文件,对文件所有者来说可读可写,文件所有者的组成员可以读该文件,其他所有人都可以读该文件-rwxr-xr-x:一个普通文件,对文件所有者来说可读、可写、可执行。也可以被其他的所有人读取和执行-rw-rw----:一个普通文件,对文件所有者以及文件所有者的组成员来说可读可写lrwxrwxrwx:一个符号链接,符号链接的权限都是虚拟的,真实的权限应该以符号链接指向的文件为准drwxrwx---:一个目录,文件所有者以及文件所有者的组成员可以访问该目录,并且可以在该目录下新建、重命名、删除文件drwxr-x---:一个目录,文件所有者可以访问该目录,并且可以在该目录下新建、重命名、删除文件,文件所有者的组成员可以访问该目录,但是不能新建、重命名、删除文件更改文件的权限有两种表示方法,一种是用数字表示权限,另一种是用 rwx 表示权限。为了说明怎么用数字表示权限,我们得先来了解一下八进制。
八进制(以 8 为基数)及其亲戚十六进制(以 16 为基数)都是数字系统,通常被用来表示计算机中的数字。我们人类,因为(或者至少大多数人)天生有 十个手指的事实,利用以 10 为基数的数字系统来计数。计算机,从另一方面讲,生来只有一个 手指,因此它以二进制(以 2 为基数)来计数。它们的数字系统只有两个数值,0 和 1。 因此在二进制中,计数看起来像这样: 0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001, 1010, 1011… 在八进制中,逢八进一,用数字 0 到 7 来计数,像这样: 0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 20, 21… 十六进制中,使用数字 0 到 9,加上大写字母”A”到”F”来计数,逢 16 进一: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, 10, 11, 12, 13… 虽然我们能知道二进制的意义(因为计算机只有一个手指),但是八进制和十六进制对什么好处呢? 答案是为了人类的便利。许多时候,在计算机中,一小部分数据以二进制的形式表示。 以 RGB 颜色为例来说明。大多数的计算机显示器,每个像素由三种颜色组成:8 位红色,8 位绿色, 8 位蓝色。这样,一种可爱的中蓝色就由 24 位数字来表示: 010000110110111111001101 我不认为你每天都喜欢读写这类数字。另一种数字系统对我们更有帮助。每个十六进制 数字代表四个二进制。在八进制中,每个数字代表三个二进制数字。那么代表中蓝色的 24 位二进制能够压缩成 6 位十六进制数: 436FCD 因为十六进制中的两个数字对应二进制的 8 位数字,我们可以看到 "43" 代表红色,"6F" 代表绿色,"CD" 代表蓝色。 现在,十六进制表示法(经常叫做“hex”)比八进制更普遍,但是我们很快会看到,用八进制 来表示 3 个二进制数非常有用处…
通过八进制表示法,我们使用八进制数字来设置所期望的权限模式。因为每个八进制数字代表了 3 个二进制数字,这种对应关系,正好映射到用来存储文件模式所使用的方案上。下表展示我们所要表达的意思:

现在我们要改变某个文件或者目录的权限,只需要输入:chmod + 三位二进制 + 文件或者目录名 即可。
chmod 命令支持一种符号表示法,来指定文件模式。符号表示法分为三部分:更改会影响谁, 要执行哪个操作,要设置哪种权限。通过字符 “u”、“g”、“o”和 “a” 的组合来指定 要影响的对象,如下所示:
如果没有指定字符,则假定使用 "all"。执行的操作可能是一个“+”字符,表示加上一个权限, 一个“-”,表示删掉一个权限,或者是一个“=”,表示只有指定的权限可用,其它所有的权限被删除。
权限由 “r”、“w”和 “x” 来指定的实例:
u+x:为文件所有者添加可执行权限u-x:删除文件所有者的可执行权限+x:为文件所有者,用户组,和其他所有人添加可执行权限。 等价于 a+xo-rw:删除其他人的读权限和写权限go=rw:给文件所属的组和文件所属者/组以外的人读写权限。如果文件所属组或其他人已经拥有执行的权限,执行权限将被移除u+x,go=rw:给文件拥有者执行权限并给组和其他人读和写的权限。多种设定可以用逗号分开当创建一个文件时,umask 命令控制着文件的默认权限。umask 命令使用八进制表示法来表达从文件模式属性中删除一个位掩码。我们可以在终端输入 umask 命令来查看默认值:
eg@linux:~$ umask
0022
eg@linux:~$可以看到,Ubuntu 18.04 默认的 umask 是 0022,这个值代表的意思就是我们在创建文件和目录的时候,默认的权限要去掉掩码为 1 的位,0022 表示成二进制是:000 000 010 010,去掉为 1 的位上的权限,这里先忽略前面的三个 0,这涉及到特殊的权限,后面会讲。当我们创建文件或者目录的时候,如果没有掩码,也就是 umask = 0000 的时候,文件或者目录的权限是:-rw-rw-rw-,这个可以通过先执行 umask 0000 命令,然后再新建一个文件来验证。
-rw-rw-rw- 这个权限被称为原始权限,现在我们执行:umask 0022 将掩码恢复默认,然后在新建一个文件,这时在原始权限的基础上去掉掩码为 1 的位上的权限,也就是 -rw-rw-rw- 所对用的二进制数:110 110 110,去掉后就变成了:110 100 100。所以 Ubuntu 18.04 上,默认我们创建的文件或者目录的权限就是:-rw-r--r--。
你可能会在表示权限的字符中除了 r、w、x,还会看到一些特殊的字符:s、t。
有的时候,我们需要具有另一个用户的身份。比如我们想要得到超级用户特权,来执行一些管理任务,有时也需要变成另一个普通用户,比如说测试一个帐号。 有三种方式,可以拥有多重身份:
su + 用户名 这个命令,需要输入要切换成为的那个用户的用户密码,切换过去完成了相应的任务想要退出那个用户重新回到之前的用户可以使用 exit 命令退出sudo + 命令,比如:sudo apt update 就是使用 root 用户的权限来更新软件索引,这里值得注意的是,使用 sudo 的时候需要输入的密码不是 root 用户的密码,而是当前用户的密码。上面介绍 umask 掩码的使用的时候,都是用文件的原始权限减去掩码中后三位八进制数展开为二进制数后为 1 的位的权限得到文件的默认权限。那为什么第一位省略了呢?其实不是省略了,是一般情况下用不到,只在特殊的情况下才会用到。虽然我们通常看到一个八进制的权限掩码用后三位数字来表示,但是从技术层面上来讲, 用四位数字来表示它更确切些。为什么呢?因为除了读取、写入和执行权限之外,还有其它较少用到的权限设置。
我们在讲 sudo 命令的时候,sudo 的作用就是让普通用户使用 root 用户的权限去运行其他命令。这是怎么做到的呢?其实是使用 sudo 执行命令后,运行的程序会把用户 ID 设置成 root 用户的 ID,也就是要运行的程序属于 root 用户。这种操作通常会应用到一些由超级用户所拥有的程序。当一个普通用户运行一个程序,这个程序由根用户 (root) 所有,并且设置了 setuid 位,这个程序运行时具有超级用户的特权,这样程序就可以访问普通用户禁止访问的文件和目录。很明显,因为这会引起安全方面的问题,所有可以设置 setuid 位的程序个数,必须控制在绝对小的范围内。
setuid 的 umask 是:4000
如果设置了一个目录的 setgid 位,则目录中新创建的文件 具有这个目录用户组的所有权,而不是文件创建者所属用户组的所有权。对于共享目录来说, 当一个普通用户组中的成员,需要访问共享目录中的所有文件,而不管文件所有者的主用户组时, 那么设置 setgid 位很有用处。
setgid 的 umask 是:2000
sticky 位继承于 Unix,在 Unix 中,它可能把一个可执行文件标志为“不可交换的”。在 Linux 中,会忽略文件的 sticky 位,但是如果一个目录设置了 sticky 位, 那么它能阻止用户删除或重命名文件,除非用户是这个目录的所有者,或者是文件所有者,或是超级用户。这个经常用来控制访问共享目录,比方说 /tmp。
sticky 的 umask 是:1000
还有一些例子,使用 chmod 命令和符号表示法,来设置这些特殊的权限。
chmod u+s program chmod g+s dir chmod +t dir 当我们使用 ls 命令查看文件的时候,会看到类似下面的例子:
-rwsr-xr-x drwxrwsr-x drwxrwxrwt 本文完~
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/758/viewspace-3141613/ ,如需转载,请注明出处,否则将追究法律责任。