知道如何控制用户对文件的访问是一项必不可少的系统管理技能。了解Linux权限以及如何控制哪些用户可以访问文件是一项基本的系统管理技能。本文将涵盖标准的Linux文件系统权限,并进一步研究特殊权限,并以umask解释默认权限结束本文。了解ls命令的输出在讨论如何修改权限之前,我们需要知道如何查看权限。ls命令的长列表参数(-l)为我们提供了有关该文件的大量信息。$ls-lAhtotal20K-rwxr-xr--+1rootroot0Mar419:39file1-rw-rw-rw-.1rootroot0Mar419:39file10-rwxrwxr--+1rootroot0Mar419:39file2-rw-rw-rw-.1rootroot0Mar419:39file8-rw-rw-rw-.1rootroot0Mar419:39file9drwxrwxrwx。2rootroot4.0KMar420:04testdir为了理解这意味着什么,让我们将关于权限的输出分解成几个部分。单独理解每个部分会更容易。让我们看看上面输出中最后一行的每个组件:drwxrwxrwx.2rootroot4.0KMar420:04testdir节1节2节3节4节5节6节7Sectiondrwxrwxrwx。rootroot第1部分(左侧)显示文件类型。符号类型d目录-常规文件l软链接ls的信息页面有不同文件类型的完整列表。每个文件都有三种访问方法:OwnerGroupEveryoneelse第2、3和4部分处理用户(所有者)、组和“其他用户”权限。每个部分都可以包含r(读)、w(写)和x(执行)权限的组合。每个权限还分配了一个数值,这在讨论八进制表示法的权限时很重要。权限八进制值r4w2x1第5节描述了替代访问方法,例如SELinux或文件访问控制列表(FACL)。访问方法char没有其他访问方法-SELinux。FACL+方法组合+Sections6和7分别是所有者和组名。使用chown和chmodchown命令chown(更改所有权)命令用于更改文件的用户和组所有权。要将文件foo的用户和组所有权更改为root,我们可以使用以下命令:$chownroot:rootfoo$chownroot:foo在用户名后跟冒号(:)运行此命令将同时设置用户和组所有权。要将文件foo的用户所有权仅设置为root,请输入:$chownrootfoo要仅更改文件foo的组所有权,请在组前面加上冒号:$chown:rootfoochmod命令chmod(更改模式)命令控制属性的文件权限所有者、组和所有其他既不是所有者也不是与文件关联的组的用户。chmod命令可以设置八进制(例如755、644等)和符号(例如u+rwx、g-rwx、o=rw)格式的权限。八进制表示法为“读取”分配了4个“点”,为“写入”分配了2个“点”,为“执行”分配了1个“点”。如果要给用户(owner)分配“读”权限,就在第一个槽位分配4,但是如果要添加“写”权限,则必须加2。如果要添加“执行”,则加1.我们为每种权限类型执行此操作:所有者、组和其他人。例如,如果我们想将“读取”、“写入”和“执行”分配给文件的所有者,而只对组成员和所有其他用户分配“读取”和“执行”,我们应该使用755(八进制格式).这是所有者(4+2+1)的所有权限位,但组和其他权限只有4和1(4+1)。细分为:4+2+1=7、4+1=5、4+1=5。如果我们想将“读”和“写”分配给文件的所有者,而只对组成员和所有其他用户“读”,我们可以使用chmod,如下所示:$chmod644foo_file在下面例如,我们在不同的分组中使用符号表示法。请注意,字母u、g和o分别代表“用户”(所有者)、“组”和“其他”。我们将u、g和o与+、-或=一起使用来添加、删除或设置权限位。将“执行”位添加到所有权权限集:$chmodu+xfoo_file从组成员中删除“读”、“写”和“执行”:$chmodg-rwxfoo_file删除所有其他用户的所有权集“读取”和“写入”:$chmodo=rw特殊位:设置UID、设置GID和粘性位除了标准权限外,还有一些特殊权限位有一些其他用途。设置用户ID(suid)当对文件设置suid时,操作将作为文件的所有者执行,而不是作为运行文件的用户执行。一个很好的例子是passwd命令。它需要设置suid位,以便更改密码的操作具有root权限。$ls-l/bin/passwd-rwsr-xr-x.1rootroot27832Jun102014/bin/passwd设置suid位的示例:$chmodu+s/bin/foo_file_name设置组ID(sgid)sgid位与与suid位类似,操作是在目录的组所有权下完成的,而不是作为运行命令的用户。使用sgid的一个例子是,如果多个用户在同一个目录中工作,并且在该目录中创建的每个文件都需要具有相同的组权限。以下示例创建一个名为collab_dir的目录,设置sgid位,并将组所有权更改为webdev。$mkdircollab_dir$chmodg+scollab_dir$chown:webdevcollab_dir在该目录中创建的任何文件现在都将拥有webdev的组所有权,而不是创建该文件的用户的组。$cdcollab_dir$touchfile-sgid$ls-lahfile-sgid-rw-r--r--.1rootwebdev0Jun1206:04file-sgid"sticky"位sticky位表示只有该文件是拥有者只有拥有者才能删除该文件,即使组权限允许删除该文件。通常,此设置在公共目录或协作目录(如/tmp)上最有意义。在下面的示例中,“Everyoneelse”权限集的“Execute”列中的t表示应用了粘滞位。$ls-ld/tmpdrwxrwxrwt.8rootroot4096Jun1206:07/tmp/请记住,这不会阻止某人编辑文件,它只是阻止他们删除目录文档的内容)。我们设置stickybit为:$chmodo+tfoo_dir你可以尝试自己在目录上设置stickybit,并赋予它fullgroup权限,这样属于同一组的多个用户就可以对目录项进行读写和执行。接下来,以每个用户的身份创建文件,然后尝试以另一个用户的身份删除它们。如果一切配置正确,一个用户应该不能删除另一个用户的文件。请注意,这些位中的每一个也可以设置为八进制格式:SUID=4,SGID=2,stickybit=1。(LCTT译注:这里是四个八进制数字)$chmod4744$chmod2644$chmod1755uppercaseorlowercase?如果在要设置特殊位时看到大写S或T而不是小写字符(如我们之前所见),那是因为没有(对应的)底层执行位。为了说明这一点,以下示例创建了一个设置了粘滞位的文件。然后我们可以添加和删除执行位来演示大小写更改。$touchfilecap-ST-demo$chmod1755cap-ST-demo$ls-lcap-ST-demo-rwxr-xr-t.1rootroot0Jun1206:16cap-ST-demo$chmodo-xcap-X-demo$ls-lcap-X-demo-rwxr-xr-T。1rootroot0Jun1206:16cap-ST-demo有条件地设置执行位至此我们已经设置了小写的x位执行,不用问任何问题就可以设置。我们还有另一种选择:使用大写字母X而不是小写字母,这只会在权限组中某处已有执行位时设置执行位。这可能是一个难以解释的概念,但下面的演示将有助于说明它。请注意,在尝试将执行位添加到组权限后,该位并未设置。$touchcap-X-file$ls-lcap-X-file-rw-r--r--.1rootroot0Jun1206:31cap-X-file$chmodg+Xcap-X-file$ls-lcap-X-file-rw-r--r--.1rootroot0Jun1206:31cap-X-file在这个类似的示例中,我们首先将带有小写x的执行位添加到组权限中,然后使用大写X为所有其他用户添加权限。这一次,大写X设置权限。$touchcap-X-file$ls-lcap-X-file-rw-r--r--.1rootroot0Jun1206:31cap-X-file$chmodg+xcap-X-file$ls-lcap-X-file-rw-r-xr--.1rootroot0Jun1206:31cap-X-file$chmodo+Xcap-X-filels-lcap-X-file-rw-r-xr-x。1rootroot0Jun1206:31cap-X-file理解默认权限集中的umaskumask掩码(或“块”)位以定义文件或目录的权限。例如,umask输出中的2表示它至少在默认情况下阻止了文件的“写入”位。使用不带任何参数的umask命令可以让我们看到当前的umask设置。有四列:第一列是为特殊的suid、sgid或粘性位保留的,其余三列代表所有者、组和其他权限。$umask0022要理解这意味着什么,我们可以使用-S标志(如下所示)执行umask来解释屏蔽位的结果。例如,由于第三列中的值为2,因此“写入”位从组和其他部分中被屏蔽掉;只能为它们分配“读取”和“执行”。$umask-Su=rwx,g=rx,o=rx要查看文件和目录的默认权限集,让我们将umask设置为全零。这意味着我们在创建文件时不会屏蔽任何位。$umask000$umask-Su=rwx,g=rwx,o=rwx$touchfile-umask-000$ls-lfile-umask-000-rw-rw-rw-.1rootroot0Jul1722:03file-umask-000现在,当我们创建一个文件时,我们看到所有部分的默认权限是“读”(4)和“写”(2),相当于666的八进制表示。我们可以对目录做同样的事情,看到它的默认权限是777。我们需要在目录上使用“执行”位,以便可以遍历它们。$mkdirdir-umask-000$ls-lddir-umask-000drwxrwxrwx。2rootroot4096Jul1722:03dir-umask-000/摘要管理员可以通过许多其他方式来控制对系统文件的访问。这些权限是我们可以在其上构建的Linux的基本权限。如果您的工作向您介绍了FACL或SELinux,您会发现它们也建立在文件访问的首要规则之上。
