全面介绍 Linux 权限

知道如何控制用户对文件的访问是一项基本的系统管理技能。html

了解 Linux 权限以及如何控制哪些用户能够访问文件是系统管理的一项基本技能。linux

本文将介绍标准 Linux 文件系统权限,并进一步研究特殊权限,以及使用 umask 来解释默认权限做为文章的结束。git

理解 ls 命令的输出

在讨论如何修改权限以前,咱们须要知道如何查看权限。经过 ls 命令的长列表参数(-l)为咱们提供了有关文件的许多信息。github

$ ls -lAh
total 20K
-rwxr-xr--+ 1 root root    0 Mar  4 19:39 file1
-rw-rw-rw-. 1 root root    0 Mar  4 19:39 file10
-rwxrwxr--+ 1 root root    0 Mar  4 19:39 file2
-rw-rw-rw-. 1 root root    0 Mar  4 19:39 file8
-rw-rw-rw-. 1 root root    0 Mar  4 19:39 file9
drwxrwxrwx. 2 root root 4.0K Mar  4 20:04 testdir
复制代码

为了理解这些是什么意思,让咱们将关于权限的输出分解为各个部分。单独理解每一个部分会更容易。web

让咱们看看在上面的输出中的最后一行的每一个组件:bash

drwxrwxrwx. 2 root root 4.0K Mar  4 20:04 testdir
复制代码
第 1 节 第 2 节 第 3 节 第 4 节 第 5 节 第 6 节 第 7 节
d rwx rwx rwx . root root

第 1 节(左侧)显示文件的类型。ui

符号 类型
d 目录
- 常规文件
l 软连接

lsinfo 页面完整列出了不一样的文件类型。spa

每一个文件都有三种访问方式:code

  • 属主
  • 全部其余人    第 二、3 和 4 节涉及用户(属主)、组和“其余用户”权限。每一个部分均可以包含 r(读取)、w(写入)和 x(执行)权限的组合。

每一个权限还分配了一个数值,这在以八进制表示形式讨论权限时很重要。cdn

权限 八进制值
r 4
w 2
x 1

第 5 节描述了其余替代访问方法,例如 SELinux 或文件访问控制列表(FACL)。

访问方法 字符
没有其它访问方法 -
SELinux .
FACL +
各类方法的组合 +

第 6 节和第 7 节分别是属主和组的名称。

使用 chown 和 chmod

chown 命令

chown(更改全部权)命令用于更改文件的用户和组的全部权。

要将文件 foo 的用户和组的全部权更改成 root,咱们可使用如下命令:

$ chown root:root foo
$ chown root: foo
复制代码

在用户名后跟冒号(:)运行该命令将同时设置用户和组全部权。

要仅将文件 foo 的用户全部权设置为 root 用户,请输入:

$ chown root foo
复制代码

要仅更改文件 foo 的组全部权,请在组以前加冒号:

$ chown :root foo
复制代码

chmod 命令

chmod(更改模式)命令控制属主、组以及既不是属主也不属于与文件关联的组的全部其余用户的文件许可权。

chmod 命令能够以八进制(例如 755644 等)和符号(例如 u+rwxg-rwxo=rw)格式设置权限。

八进制表示法将 4 个“点”分配给“读取”,将 2 个“点”分配给“写入”,将 1 个点分配给“执行”。若是要给用户(属主)分配“读取”权限,则将 4 分配给第一个插槽,可是若是要添加“写入”权限,则必须添加 2。若是要添加“执行”,则要添加 1。咱们对每种权限类型执行此操做:属主、组和其余。

例如,若是咱们想将“读取”、“写入”和“执行”分配给文件的属主,但仅将“读取”和“执行”分配给组成员和全部其余用户,则咱们应使用 755(八进制格式)。这是属主的全部权限位(4+2+1),但组和其余权限的全部权限位只有 414+1)。

细分为:4+2+1=7,4+1=5 和 4+1=5。

若是咱们想将“读取”和“写入”分配给文件的属主,而只将“读取”分配给组的成员和全部其余用户,则能够以下使用 chmod

$ chmod 644 foo_file
复制代码

在下面的示例中,咱们在不一样的分组中使用符号表示法。注意字母 ugo 分别表明“用户”(属主)、“组”和“其余”。咱们将 ugo+-= 结合使用来添加、删除或设置权限位。

要将“执行”位添加到全部权权限集中:

$ chmod u+x foo_file
复制代码

要从组成员中删除“读取”、“写入”和“执行”:

$ chmod g-rwx foo_file
复制代码

要将全部其余用户的全部权设置为“读取”和“写入”:

$ chmod o=rw
复制代码

特殊位:设置 UID、设置 GID 和粘滞位

除了标准权限外,还有一些特殊的权限位,它们具备一些别的用处。

设置用户 ID(suid)

当在文件上设置 suid 时,将以文件的属主的身份而不是运行该文件的用户身份执行操做。一个好的例子passwd 命令。它须要设置 suid 位,以便更改密码的操做具备 root 权限。

$ ls -l /bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /bin/passwd
复制代码

设置 suid 位的示例:

$ chmod u+s /bin/foo_file_name
复制代码

设置组 ID(sgid)

sgid 位与 suid 位相似,操做是在目录的组全部权下完成的,而不是以运行命令的用户身份。

一个使用 sgid 的例子是,若是多个用户正在同一个目录中工做,而且目录中建立的每一个文件都须要具备相同的组权限。下面的示例建立一个名为 collab_dir 的目录,设置 sgid 位,并将组全部权更改成 webdev

$ mkdir collab_dir
$ chmod g+s collab_dir
$ chown :webdev collab_dir
复制代码

如今,在该目录中建立的任何文件都将具备 webdev 的组全部权,而不是建立该文件的用户的组。

$ cd collab_dir
$ touch file-sgid
$ ls -lah file-sgid
-rw-r--r--. 1 root webdev 0 Jun 12 06:04 file-sgid
复制代码

“粘滞”位

粘滞位表示,只有文件全部者才能删除该文件,即便组权限容许该文件能够删除。一般,在 /tmp 这样的通用或协做目录上,此设置最有意义。在下面的示例中,“全部其余人”权限集的“执行”列中的 t 表示已应用粘滞位。

$ ls -ld /tmp
drwxrwxrwt. 8 root root 4096 Jun 12 06:07 /tmp/
复制代码

请记住,这不会阻止某我的编辑该文件,它只是阻止他们删除该目录的内容(LCTT 译注:即删除目录下文件)。

咱们将粘滞位设置为:

$ chmod o+t foo_dir
复制代码

你能够本身尝试在目录上设置粘滞位并赋予其完整的组权限,以便多个属于同一组的用户能够在目录上进行读取、写入和执行。

接着,以每一个用户的身份建立文件,而后尝试以另外一个用户的身份删除它们。

若是一切配置正确,则一个用户应该不能从另外一用户那里删除文件。

请注意,这些位中的每一个位也能够用八进制格式设置:SUID = 四、SGID = 2 和 粘滞位 = 1。(LCTT 译注:这里是四位八进制数字)

$ chmod 4744
$ chmod 2644
$ chmod 1755
复制代码

大写仍是小写?

若是要设置特殊位时看到大写的 ST 而不是小写的字符(如咱们以前所见),那是由于不存在(对应的)底层的执行位。为了说明这一点,下面的示例建立一个设置了粘滞位的文件。而后,咱们能够添加和删除执行位以演示大小写更改。

$ touch file cap-ST-demo
$ chmod 1755 cap-ST-demo
$ ls -l cap-ST-demo
-rwxr-xr-t. 1 root root 0 Jun 12 06:16 cap-ST-demo

$ chmod o-x cap-X-demo
$ ls -l cap-X-demo
-rwxr-xr-T. 1 root root 0 Jun 12 06:16 cap-ST-demo
复制代码

有条件地设置执行位

至此,咱们使用小写的 x 设置了执行位,而无需询问任何问题便可对其进行设置。咱们还有另外一种选择:使用大写的 X 而不是小写的,它将仅在权限组中某个位置已经有执行位时才设置执行位。这多是一个很难解释的概念,可是下面的演示将帮助说明它。请注意,在尝试将执行位添加到组特权以后,该位没有被设置上。

$ touch cap-X-file
$ ls -l cap-X-file
-rw-r--r--. 1 root root 0 Jun 12 06:31 cap-X-file
$ chmod g+X cap-X-file
$ ls -l cap-X-file
-rw-r--r--. 1 root root 0 Jun 12 06:31 cap-X-file
复制代码

在这个相似的例子中,咱们首先使用小写的 x 将执行位添加到组权限,而后使用大写的 X 为全部其余用户添加权限。此次,大写的 X设置了该权限。

$ touch cap-X-file
$ ls -l cap-X-file
-rw-r--r--. 1 root root 0 Jun 12 06:31 cap-X-file
$ chmod g+x cap-X-file
$ ls -l cap-X-file
-rw-r-xr--. 1 root root 0 Jun 12 06:31 cap-X-file
$ chmod o+X cap-X-file
ls -l cap-X-file
-rw-r-xr-x. 1 root root 0 Jun 12 06:31 cap-X-file
复制代码

理解 umask

umask 会屏蔽(或“阻止”)默认权限集中的位,以定义文件或目录的权限。例如,umask输出中的 2 表示它至少在默认状况下阻止了文件的“写入”位。

使用不带任何参数的 umask 命令可使咱们看到当前的 umask 设置。共有四列:第一列为特殊的suidsgid 或粘滞位而保留,其他三列表明属主、组和其余人的权限。

$ umask
0022
复制代码

为了理解这意味着什么,咱们能够用 -S 标志来执行 umask(以下所示)以解释屏蔽位的结果。例如,因为第三列中的值为 2,所以将“写入”位从组和其余部分中屏蔽掉了;只能为它们分配“读取”和“执行”。

$ umask -S
u=rwx,g=rx,o=rx
复制代码

要查看文件和目录的默认权限集是什么,让咱们将 umask 设置为全零。这意味着咱们在建立文件时不会掩盖任何位。

$ umask 000
$ umask -S
u=rwx,g=rwx,o=rwx

$ touch file-umask-000
$ ls -l file-umask-000
-rw-rw-rw-. 1 root root 0 Jul 17 22:03 file-umask-000
复制代码

如今,当咱们建立文件时,咱们看到全部部分的默认权限分别为“读取”(4)和“写入”(2),至关于八进制表示 666

咱们能够对目录执行相同的操做,并看到其默认权限为 777。咱们须要在目录上使用“执行”位,以即可以遍历它们。

$ mkdir dir-umask-000
$ ls -ld dir-umask-000
drwxrwxrwx. 2 root root 4096 Jul 17 22:03 dir-umask-000/
复制代码

总结

管理员还有许多其余方法能够控制对系统文件的访问。这些权限是 Linux 的基本权限,咱们能够在这些基础上进行构建。若是你的工做为你引入了 FACL 或 SELinux,你会发现它们也创建在这些文件访问的首要规则之上。


via: opensource.com/article/19/…

做者:Alex Juarez 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关文章
相关标签/搜索