Linux 一切皆文件

本文借着 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:~$

可以看到,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。

5、切换用户

有的时候,我们需要具有另一个用户的身份。比如我们想要得到超级用户特权,来执行一些管理任务,有时也需要变成另一个普通用户,比如说测试一个帐号。 有三种方式,可以拥有多重身份:

  • 注销系统并以其他用户身份重新登录系统
    • 这个注销登录其他用户和 Windows 是差不多的,所以这里就不介绍了。
  • 使用 su 命令
    • 比如我们要切换到其他用户,使用 su + 用户名 这个命令,需要输入要切换成为的那个用户的用户密码,切换过去完成了相应的任务想要退出那个用户重新回到之前的用户可以使用 exit 命令退出
  • 使用 sudo 命令
    • sudo 命令主要是使用 root 用户来执行命令,命令格式是:sudo + 命令,比如:sudo apt update 就是使用 root 用户的权限来更新软件索引,这里值得注意的是,使用 sudo 的时候需要输入的密码不是 root 用户的密码,而是当前用户的密码。

6、Linux 下一些特殊权限

上面介绍 umask 掩码的使用的时候,都是用文件的原始权限减去掩码中后三位八进制数展开为二进制数后为 1 的位的权限得到文件的默认权限。那为什么第一位省略了呢?其实不是省略了,是一般情况下用不到,只在特殊的情况下才会用到。虽然我们通常看到一个八进制的权限掩码用后三位数字来表示,但是从技术层面上来讲, 用四位数字来表示它更确切些。为什么呢?因为除了读取、写入和执行权限之外,还有其它较少用到的权限设置。

6.1、setuid 位

我们在讲 sudo 命令的时候,sudo 的作用就是让普通用户使用 root 用户的权限去运行其他命令。这是怎么做到的呢?其实是使用 sudo 执行命令后,运行的程序会把用户 ID 设置成 root 用户的 ID,也就是要运行的程序属于 root 用户。这种操作通常会应用到一些由超级用户所拥有的程序。当一个普通用户运行一个程序,这个程序由根用户 (root) 所有,并且设置了 setuid 位,这个程序运行时具有超级用户的特权,这样程序就可以访问普通用户禁止访问的文件和目录。很明显,因为这会引起安全方面的问题,所有可以设置 setuid 位的程序个数,必须控制在绝对小的范围内。

setuid 的 umask 是:4000

6.2、setgid 位

如果设置了一个目录的 setgid 位,则目录中新创建的文件 具有这个目录用户组的所有权,而不是文件创建者所属用户组的所有权。对于共享目录来说, 当一个普通用户组中的成员,需要访问共享目录中的所有文件,而不管文件所有者的主用户组时, 那么设置 setgid 位很有用处。

setgid 的 umask 是:2000

6.3、sticky 位

sticky 位继承于 Unix,在 Unix 中,它可能把一个可执行文件标志为“不可交换的”。在 Linux 中,会忽略文件的 sticky 位,但是如果一个目录设置了 sticky 位, 那么它能阻止用户删除或重命名文件,除非用户是这个目录的所有者,或者是文件所有者,或是超级用户。这个经常用来控制访问共享目录,比方说 /tmp。

sticky 的 umask 是:1000

6.4、其他

还有一些例子,使用 chmod 命令和符号表示法,来设置这些特殊的权限。

  • 首先, 授予一个程序 setuid 权限
    • chmod u+s program
  • 下一步,授予一个目录 setgid 权限
    • chmod g+s dir
  • 最后,授予一个目录 sticky 权限
    • chmod +t dir

当我们使用 ls 命令查看文件的时候,会看到类似下面的例子:

  • setuid 属性
    • -rwsr-xr-x
  • setgid 属性
    • drwxrwsr-x
  • 设置了 sticky 位
    • drwxrwxrwt

本文完~

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值