Linux 一切皆文件

2020-07-08 00:00:00 用户 文件 目录 权限 所有者

本文借着 Linux 下那句的“Linux 一切皆文件”,讲解一下 Linux 下文件的权限和 root 用户,普通用户,什么是用户组等。

提起 Linux,我想大家都听说过这句话:Linux 一切皆文件。那它是什么意思呢?我们一起来看看吧。

  • Linux 下的可执行程序是一个二进制文件。
  • 程序启动的时候可能需要加载一些配置文件,这些配置文件一般都是文本文件;程序运行的时候会产生一些日志文件或者中间文件,这些一般也都是文本文件。
  • 如果程序产生的日志需要打印到控制台上,那我们操作的也是一个文件,这个文件是标准输出文件:stdout 文件。
  • 各个程序之间可能会做数据的交互,比如一个程序的输出是另一个程序的输入,这也需要操作一个文件,这种文件叫管道文件。
  • 不同的程序之间通信还可以使用 socket 通信,socket 也是一个文件,我们在 socket 编程的时候就需要打开一个 socket 文件。
  • 运行中的程序可能需要访问一些硬件设备,每个硬件设备在 Linux 上也是映射成了文件,比如硬盘一般就是 /dev/sd*。
  • 文件本省需要有地方存储,存储文件的东西叫文件夹,文件夹自身也是一种文件。

上面列举了一些 Linux 系统中常见的文件,还是那句话,Linux 一切皆文件,只要你能感知到的,在 Linux 上都是被抽象成文件了的。

了解我 Linux 一切皆文件后,我们再来学习几个重要的知识点。

1、用户、用户组和其他

我们在使用一些命令的时候,shell 可能会提示我们没有权限访问。从使用 Linux 系统到现在,你一定遇到过下图中类似的提示。

其实这些提示的意思就是作为一个普通用户,没有权限来读取这些文件。那权限到底是个什么东西呢?先别急,听我慢慢道来。

一个用户可以拥有文件和目录。当一个用户拥有一个文件或目录时, 用户对这个文件或目录就有访问权限和控制权限。用户又会属于一个由一个或多个用户组成的用户组,用户组成员对这些文件和目录的权限由文件和目录的所有者授予。除了对一个用户组授予权限之外,文件所有者可能会给其他用户或者用户组成员一些权限。

上图展示了 id 命令的使用和输出结果,从输出结果中,我们能获取到一些重要的信息。

  • uid:在安装系统的时候我们会新建一个普通用户 eg (当然,也是可以在系统安装好后另外新建的其他用户,这里我登录的用户是 eg,所以我输入 id 命令后得到的结果中 uid 这个字段的名字就是 eg),这里的 uid 就像身份证号码和身份证号码对应人一样,它代表着一种对应关系,其中,身份证号码是:1000,名字是 eg
  • gid:gid 是用户 eg 所属的用户组的身份对应信息
  • groups:这个字段后面的值是很多用逗号隔开的值,代表这 eg 这个用户还属于这些用户组,这些用户组成员共同拥有的权限,eg 这个用户也是拥有的。

在这里用户是 eg,用户数组是 eg,其他就很多了,有 adm、cdrom、sudo 等等。

2、读取、写入和执行

对于文件和目录的访问权力是根据读访问、写访问和执行访问来定义的。我们来看看 ls -l test.txt 这个命令的执行结果(注意:test.txt 是我自己创建的一个文件,你可以把它换成你自己的文件)。

这行内容的前十个字符是文件的属性。这十个字符的个字符表明文件类型。下表是经常看到的文件类型(还有其它的,不常见类型):

  • -:普通文件
  • d:目录
  • l:符号链接。注意对于符号链接文件,剩余的文件属性总是 "rwxrwxrwx",而且都是虚拟值。真正的文件属性是指符号链接所指向的文件的属性
  • c:字符设备文件。这种文件类型是指按照字节流来处理数据的设备。 比如说终端机或者调制解调器
  • b:块设备文件。这种文件类型是指按照数据块来处理数据的设备,例如一个硬盘或者 CD-ROM 盘

剩下的九个字符叫做文件模式,代表着文件所有者、文件组所有者和其他人的读、写和执行权限。

当设置文件模式后,r、w和x 模式属性对文件和目录会产生以下影响:

  • r
    • 文件:允许打开并读取文件内容
    • 目录:允许列出目录中的内容,前提是目录必须设置了可执行属性(x)

  • w
    • 文件:允许写入文件内容或截断文件。但是不允许对文件进行重命名或删除,重命名或删除是由目录的属性决定的
    • 目录:允许在目录下新建、删除或重命名文件,前提是目录必须设置了可执行属性(x)
  • x
    • 文件:允许将文件作为程序来执行,使用脚本语言编写的程序必须设置为可读才能被执行
    • 目录:允许进入目录,例如:cd directory

下面是权限属性的一些例子:

  • -rwx------:一个普通文件,对文件所有者来说可读、可写、可执行。其他人无法访问
  • -rw-------:一个普通文件,对文件所有者来说可读可写。其他人无法访问
  • -rw-r--r--:一个普通文件,对文件所有者来说可读可写,文件所有者的组成员可以读该文件,其他所有人都可以读该文件
  • -rwxr-xr-x:一个普通文件,对文件所有者来说可读、可写、可执行。也可以被其他的所有人读取和执行
  • -rw-rw----:一个普通文件,对文件所有者以及文件所有者的组成员来说可读可写
  • lrwxrwxrwx:一个符号链接,符号链接的权限都是虚拟的,真实的权限应该以符号链接指向的文件为准
  • drwxrwx---:一个目录,文件所有者以及文件所有者的组成员可以访问该目录,并且可以在该目录下新建、重命名、删除文件
  • drwxr-x---:一个目录,文件所有者可以访问该目录,并且可以在该目录下新建、重命名、删除文件,文件所有者的组成员可以访问该目录,但是不能新建、重命名、删除文件

3、chmod - 更改文件权限

更改文件的权限有两种表示方法,一种是用数字表示权限,另一种是用 rwx 表示权限。为了说明怎么用数字表示权限,我们得先来了解一下八进制。

3.1、八进制

八进制(以 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 + 三位二进制 + 文件或者目录名 即可。

3.2、通过字符改变权限

chmod 命令支持一种符号表示法,来指定文件模式。符号表示法分为三部分:更改会影响谁, 要执行哪个操作,要设置哪种权限。通过字符 “u”、“g”、“o”和 “a” 的组合来指定 要影响的对象,如下所示:

  • u:"user" 的简写,意思是文件或目录的所有者
  • g:用户组
  • o:"others" 的简写,意思是其他所有的用户和用户组
  • a:"all" 的简写,是 "u", "g"和 "o" 三者的联合

如果没有指定字符,则假定使用 "all"。执行的操作可能是一个“+”字符,表示加上一个权限, 一个“-”,表示删掉一个权限,或者是一个“=”,表示只有指定的权限可用,其它所有的权限被删除。

权限由 “r”、“w”和 “x” 来指定的实例:

  • u+x:为文件所有者添加可执行权限
  • u-x:删除文件所有者的可执行权限
  • +x:为文件所有者,用户组,和其他所有人添加可执行权限。 等价于 a+x
  • o-rw:删除其他人的读权限和写权限
  • go=rw:给文件所属的组和文件所属者/组以外的人读写权限。如果文件所属组或其他人已经拥有执行的权限,执行权限将被移除
  • u+x,go=rw:给文件拥有者执行权限并给组和其他人读和写的权限。多种设定可以用逗号分开

4、umask - 设置默认权限

当创建一个文件时,umask 命令控制着文件的默认权限。umask 命令使用八进制表示法来表达从文件模式属性中删除一个位掩码。我们可以在终端输入 umask 命令来查看默认值:

eg@linux:~$ umask 
0022
eg@linux:~$

相关文章