神刀安全网

学习 Linux,101: 管理文件权限和所有权

概述

学习更多知识。开发更多项目。联系更多同行。

全新的 developerWorks Premium 会员计划提供了强大的开发工具和资源,包括 500 篇通过 Safari Books Online 提供的顶级技术文章(其中数十篇文章是专门针对 Linux 开发人员的)、最重要开发人员活动的大幅折扣、最新的 O’Reilly 大会的视频录像,等等。立即注册。

在本教程中,学习通过正确使用文件和目录权限和所有权来控制文件访问。学习:

  • 管理常规和特殊文件以及目录上的访问权限
  • 使用不同访问模式维护安全性,比如 suid、sgid 和粘滞位
  • 更改文件创建掩码
  • 向组成员授予文件访问权

本教程可以帮助您针对 Linux Server Professional (LPIC-1) 考试 101 的主题 104 中的目标 104.5 进行应考准备。该目标的权重为 3。

用户、组和文件所有权

目前为止,您已经知道 Linux 是一种多用户系统,每个用户属于一个主要组和其他可能的组。也可以使用一个用户的身份进行登录,使用 susudo -s 命令变成另一个用户。Linux 中的文件所有权和访问权限与用户 id 和组紧密相关。

我们在前面的教程 “ 学习 Linux 101:管理磁盘配额 ” 中介绍了本教程中的一些文件和组所有权概念。本教程将帮助您更全面地理解这些概念。

关于本系列

本教程系列帮助学习 Linux 系统管理任务。您还可以使用这些教程中的资料来对 Linux Professional Institute 的 LPIC-1:Linux 服务器专业认证考试 进行应考准备。

请参阅 “ 学习 Linux,101 :LPIC-1 学习路线图 ”,查看本系列中每部教程的描述和链接。这个路线图仍在开发中,目前反映的最新内容是在 2015 年 4 月 15 日更新的 4.0 版 LPIC-1 考试目标。一旦完成这些教程后,我们会将它们添加到路线图中。

前提条件

要从本系列教程中获得最大收获,您应该拥有 Linux 的基本知识和一个正常工作的 Linux 系统,您可在这个系统上实践本教程中涵盖的命令。除非另行说明,本教程中的示例使用 CentOS 6 和 2.6.-573 内核。有时,程序的不同版本将得到不同的输出格式,所以您的结果可能并不总是与这里给出的清单和图完全相同。

除非另行说明,本教程中的示例使用了 Fedora 13 和 2.6.34 内核。您在其他系统上的结果可能有所不同。

用户和组

首先,让我们复习一下一些基本的用户和组信息。

我是谁?

如果您尚未变成另一个用户,那么您的 ID 仍是您用于登录的 ID。如果您已经变成了另一个用户,您的提示符可能包含您的用户 ID,像本教程中的大部分示例一样。如果您的提示符不包含您的用户 ID,那么您可以使用 whoami 命令检查您当前的有效 id。清单 1 给出了提示符字符串(来自 PS1 环境变量)与本教程中的其他示例不同的一些示例。在提示符字符串中包含您的 ID 是一个很有用的功能。

清单 1. 确定有效的用户 id

[ian@attic4-cent ~]$ whoami ian [ian@attic4-cent ~]$ ksh -l $ whoami ian $ su jenni Password:  [jenni@attic4-cent ian]$ whoami jenni [jenni@attic4-cent ian]$ echo "$PS1" [/u@/h /W]/$  [jenni@attic4-cent ian]$ su - mary Password:  [mary@attic4-cent ~]$ whoami mary

我属于哪些组?

类似地,您可以使用 groups 命令确定您属于哪些组。您可以使用 id 命令查找用户和组信息。通过将一个用户 ID 参数添加到 groupsid ,就可以查看该用户 ID 而不是当前用户 ID 信息。清单 2 给出了一些示例。请注意,如果没有用户 ID, id 命令也会显示 SELinux 上下文以及基本的 ID 信息。

清单 2. 确定组成员关系

[ian@attic4-cent ~]$ id uid=1000(ian) gid=1000(ian) groups=1000(ian),1002(development),8093(editor) context= unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 [ian@attic4-cent ~]$ id ian uid=1000(ian) gid=1000(ian) groups=1000(ian),1002(development),8093(editor) [ian@attic4-cent ~]$ groups ian development editor [ian@attic4-cent ~]$ id jenni uid=1004(jenni) gid=1004(jenni) groups=1004(jenni),1002(development) [ian@attic4-cent ~]$ groups jenni jenni : jenni development [ian@attic4-cent ~]$ su jenni Password:  [jenni@attic4-cent ian]$ groups jenni development [jenni@attic4-cent ian]$ groups ian ian : ian development editor

文件所有权和权限

就像每个用户都有 ID 而且是一个主要组的成员一样,Linux 系统上的每个文件都有一个所有者和一个与之关联的组。

普通文件

可以使用 ls -l 命令显示所有者和组。

清单 3. 确定文件所有权

[ian@attic4-cent ~]$ ls -l /bin/bash .bashrc helloworld.C -rw-r--r--. 1 ian  ian            124 Oct 16  2014 .bashrc -rwxr-xr-x. 1 root root        906152 Jul 23 14:55 /bin/bash -rw-rw-r--. 1 ian  development    116 Aug  8 21:40 helloworld.C

在这个特定的示例中,用户 ian 的 .bashrc 文件归 ian 所有并位于 ian 组中,这是他的主要组。类似地,/bin/bash 归用户 root 所有并位于组 root 中。但是,helloworld.C 归用户 ian 所有,但它的组为 development。用户名称和组名称来自不同的命名空间,所以某个给定名称可以同时是用户名称和组名称。事实上,许多发行版默认情况下会为每个新用户创建一个匹配的组。

Linux 权限模型为每个文件系统对象提供了 3 种类型的权限。这些权限是读 (r)、写 (w) 和执行 (x)。写权限包括修改或删除对象的能力。此外,这些权限为文件的所有者、文件的组的成员和其他每个用户分开指定。

请参阅 清单 3 的第一列,请注意,它包含一个 11 字符的字符串。第 11 个字符是新添加的。我们稍后将会讨论它。第一个字符描述对象类型(在本例中, - 表示普通文件),接下来的 9 个字符表示 3 个组,每组 3 个字符。第一组表示文件所有者的读、写和执行权限。 - 表示未授予相应的权限。所以用户 ian 可以读和写 .bashrc 文件,但不能执行它;而 root 可以读、写 执行 /bin/bash 文件。第二组表示文件的组的读、写和执行权限。development 组的成员可以读或写 ian 的 helloworld.C 文件,而其他所有人只能读它。类似地,root 组的成员和其他所有人都可以读或执行 /bin/bash 文件。

目录

目录使用与普通文件相同的权限标志,但它们具有不同的解释。

  • 目录的读权限允许拥有该权限的用户列出该目录的内容。
  • 写权限表示拥有该权限的用户能够在该目录中创建或删除文件。
  • 执行权限允许用户进入该目录并访问任何子目录。

如果没有目录上的执行权限,则无法访问该目录内的文件系统对象。如果没有目录上的读权限,则无法在目录列表中查看该目录内的文件系统对象,但只要您知道该对象在磁盘上的完整路径,就可以访问这些对象。清单 4 是一个演示这些概念的人为示例。

清单 4. 权限和目录

[ian@attic4-cent ~]$ ls -l /home total 32 drwx------.  4 chris       chris       4096 Aug  8 18:11 chris drwx--x---.  4 development development 4096 Aug  7 16:00 development drwxr-x---. 26 greg        development 4096 Aug  8 22:01 greg drwx------. 42 ian         ian         4096 Aug  8 21:40 ian drwx------. 26 ian-500     ian-500     4096 Aug  8 21:59 ian-500 drwx------. 26 jenni       jenni       4096 Aug  8 21:52 jenni drwx------. 26 mary        mary        4096 Aug  8 21:53 mary drwx------. 26 testuser    testuser    4096 Aug  7 22:07 testuser [ian@attic4-cent ~]$ ls -a ~greg/.ba* /home/greg/.bash_history  /home/greg/.bash_profile /home/greg/.bash_logout   /home/greg/.bashrc [ian@attic4-cent ~]$ ls -a ~jenni ls: cannot open directory /home/jenni: Permission denied [ian@attic4-cent ~]$ ls -a ~development ls: cannot open directory /home/development: Permission denied [ian@attic4-cent ~]$ head -n 3 ~development/.bashrc # .bashrc  # Source global definitions

这个长列表中的第一个字符描述对象的类型( d 表示目录)。development 组的成员拥有用户 greg 的主目录的读和执行权限,所以用户 mary 和 ian 可以列出该目录。jenni 组或其他用户没有用户 jenni 的主目录的读和执行权限,所以用户 ian 无法访问它。用户 development 的主目录拥有执行权限,但没有读权限,所以用户 ian 无法列出这些内容,但如果他知道该目录内存在对象,可以访问这些对象。

其他文件系统对象

来自 ls -l 的输出可能包含清单中的第一个字符所显示的文件和目录以外的文件系统对象。本教程后面将会看到更多这样的对象,但就目前而言,只需那些最常见的对象类型。

表 1. 文件系统对象类型

代码 对象类型
普通文件
d 目录
l 符号链接
c 字符特殊设备
b 块特殊设备
p FIFO
s 套接字

第 11 个字符

来自 ls 命令的长清单中的第 11 个字符是最近提高的一项增强功能,所以一些发行版现在可能仅显示前 10 个字符。在其他情况下,第 11 个字符是一个空格,所以您可能不会注意到它。这个字符指定一种替代性的访问方法是否适用于该文件。当文件模式位后面的字符是一个空格时,没有替代性访问方法。当它是一个印刷字符时,则存在这样一种方法。举例而言,该方法可能是一个访问控制列表。GNU ls 使用了一个 “.”(句点)字符来表示一个仅具有 SELinux 安全性上下文的文件。具有其他任何替代访问方法组合的文件使用 “+”(加号)字符来标记。

更改权限

添加权限

假设您创建一个 “Hello world” shell 脚本。在首次创建该脚本时,它通常无法执行。可以使用带 +x 选项的 chmod 命令来添加执行权限,如 清单 5 所示。

清单 5. 创建一个可执行的 shell 脚本。

[ian@attic4-cent ~]$ echo 'echo "Hello world!"'>hello.sh [ian@attic4-cent ~]$ ls -l hello.sh -rw-rw-r--. 1 ian ian 20 Aug  8 22:18 hello.sh [ian@attic4-cent ~]$ ./hello.sh bash: ./hello.sh: Permission denied [ian@attic4-cent ~]$ chmod +x hello.sh [ian@attic4-cent ~]$ ./hello.sh Hello world! [ian@attic4-cent ~]$ ls -l hello.sh -rwxrwxr-x. 1 ian ian 20 Aug  8 22:18 hello.sh

您可以通过类似的方式使用 +r 设置读权限,使用 +w 设置写权限。事实上,您可以使用 rwx 的任何组合。例如,使用 chmod +rwx 会为文件设置所有读、写和执行权限。这种形式的 chmod 会添加还未设置的权限。

保持选择性

您可能在上面的示例中已注意到,我们为所有者、组 其他用户设置了执行权限。为了更具有选择性,您可以为模式表达式添加前缀 u 来设置用户的权限,添加前缀 g 来为组设置用户权限,添加前缀 o 来为其他用户设置权限。指定 a 会为所有用户设置该权限,这等效于省略它。清单 6 展示了如何向用户和组添加该 shell 脚本的另一个副本的写和执行权限。

清单 6. 选择性地添加权限

[ian@attic4-cent ~]$ echo 'echo "Hello world!"'>hello2.sh [ian@attic4-cent ~]$ chmod ug+xw hello2.sh [ian@attic4-cent ~]$ ls -l hello2.sh -rwxrwxr--. 1 ian ian 20 Aug  9 06:22 hello2.sh [

删除权限

有时您需要删除权限,而不是添加它们。只需将 + 更改为 - ,就可以删除任何已设置的指定权限。清单 7 展示了如何为其他用户删除这两个 shell 脚本上的所有权限。

清单 7. 删除权限

[ian@attic4-cent ~]$ ls -l hello*.sh -rwxrwxr--. 1 ian ian 20 Aug  9 06:22 hello2.sh -rwxrwxr-x. 1 ian ian 20 Aug  8 22:18 hello.sh [ian@attic4-cent ~]$ chmod o-xrw hello*.sh [ian@attic4-cent ~]$ ls -l hello*.sh -rwxrwx---. 1 ian ian 20 Aug  9 06:22 hello2.sh -rwxrwx---. 1 ian ian 20 Aug  8 22:18 hello.sh

您一次可以更改多个文件上的权限。与在针对主题 103 的教程中遇到的其他一些命令一样,您甚至可以使用 -R (或 --recursive )选项来递归地操作目录和文件。

设置权限

现在您已经可以添加或删除权限,您可能想知道如何仅设置一组特定的权限。可以使用 = 代替 +- 来实现此操作。要设置上述脚本上的权限,以便其他用户没有访问权,可以使用 chmod o= hello* ,而不是我们用于删除权限的命令。

如果您想为用户、组或其他用户设置不同的权限,可以使用逗号将不同表达式分开(例如 ug=rwx,o=rx ),或者可以使用数值权限(接下来将会介绍)。

八进制权限

目前您已使用符号(ugoa 和 rxw)指定权限。每个组中有 3 种可能的权限。也可以使用八进制数代替符号来设置权限。通过这种方式设置的权限最多使用 4 个八进制数。我们在讨论属性时将介绍第 1 个数。第 2 个书定义用户权限,第 3 个数定义组权限,第 4 个数定义其他权限。这 3 个数中的每一个都通过添加想要的权限设置来构造:读 (4)、写 (2) 和执行 (1)。在 清单 5 中的 hello.sh 示例中,为创建的脚本使用了权限 -rw-r–r–,对应于八进制数 644。为每个人都设置执行权限会将模式更改为 755。

在想要一次设置所有权限,而不为每个组提供相同的权限时,使用数值权限非常方便。可以使用 表 2 作为八进制权限的方便参考。

表 2. 数值权限

符号 八进制
rwx 7
rw- 6
r-x 5
r-- 4
-wx 3
-w- 2
--x 1
--- 0

访问模式

在登录后,新 shell 进程会使用您的用户和组 ID 来运行。这些是控制您对系统上任何文件的访问的权限。这通常意味着您不能访问数据其他用户的文件,不能写入系统文件。事实上,用户完全依赖于其他程序来代表我们执行操作。因为您启动的程序继承了 您的 用户 id,所以它们无法访问您无权访问的任何文件系统对象。

一个重要的示例是 /etc/passwd 文件,它无法由普通用户直接更改,因为只有 root 用户能启用写权限。但是,在需要更改其密码时,普通用户需要能够以某种方式修改 /etc/passwd。所以,如果用户无法修改此文件,如何实现此目的?

suid 和 sgid

Linux 权限模型有两种特殊的访问模式,称为 suid(设置用户 id)和 sgid(设置组 id)。一个可执行程序设置了 suid 访问模式时,它运行起来就像是由文件的所有者启动的一样,而不是由真正启动它的用户启动的。类似地,在设置 sgid 访问模式后,该程序运行起来就像启动的用户属于该文件的组,而不是他自己的组。可单独或同时设置两种访问模式。

清单 8 表明 passwd 可执行程序由 root 所有:

清单 8. /usr/bin/passwd 上的 suid 访问模式

[ian@attic4-cent ~]$ ls -l /usr/bin/passwd -rwsr-xr-x. 1 root root 30768 Feb 22  2012 /usr/bin/passwd

请注意,用户的权限三元组中的 xs 替代。这表明对于这个特定的程序,设置了 suid 和可执行位。所以当 passwd 运行时,它执行起来就像具有完整的超级用户访问权的 root 用户启动了它,而不是运行它的用户启动 它。因为 passwd 使用 root 访问权运行,所以它可以修改 /etc/passwd。

suid 和 sgid 位占用了长目录清单中针对用户和组的 x 位。如果该文件是可执行的,suid 或 sgid 位(如果已设置)将显示为小写的 s 。否则,它们显示为大写的 S

尽管 suid 和 sgid 使用起来很方便,甚至在许多情况下必不可少,但是,如果不在当地使用这些访问模式,可能破坏系统的安全性。您拥有尽可能少的 suid 程序。 passwd 命令是为数不多的 必须 为 suid 的程序之一。

设置 suid 和 sgid

suid 和 sgid 位使用字母 s 以符号方式设置和重新设置。例如, u+s 设置 suid 访问模式, g-s 删除 sgid 模式。在八进制格式中,suid 在第一个(高阶)数中具有值 4,而 sgid 具有值 2。

目录和 sgid

当一个目录启用了 sgid 模式时,其中创建的任何文件或目录都将继承该目录的组 ID。这对一组参与同一个项目的人使用的目录树特别有用。

清单 9 展示了用户 greg 如何设置 development 组的所有用户都可以访问的一个目录,以及用户 jenni 在该目录中创建一个文件的示例。在完成创建之后,文件 jenni.txt 允许组成员写入该文件,所以 jenni 使用 chmod g-w 来禁用组写入功能。

清单 9. sgid 访问模式和目录

[greg@attic4-cent ~]$ mkdir lpi101 [greg@attic4-cent ~]$ chmod g+ws lpi101 [greg@attic4-cent ~]$ ls -ld lpi101 drwxrwsr-x. 2 greg development 4096 Aug  9 06:43 lpi101 [greg@attic4-cent ~]$ su - jenni Password:  [jenni@attic4-cent ~]$ touch ~greg/lpi101/jenni.txt [jenni@attic4-cent ~]$ ls -l ~greg/lpi101/jenni.txt -rw-rw-r--. 1 jenni development 0 Aug  9 06:44 /home/greg/lpi101/jenni.txt [jenni@attic4-cent ~]$ chmod g-w ~greg/lpi101/jenni.txt  [jenni@attic4-cent ~]$ ls -l ~greg/lpi101/jenni.txt -rw-r--r--. 1 jenni development 0 Aug  9 06:44 /home/greg/lpi101/jenni.txt

development 组的任何成员现在都可以在用户 greg 的 lpi101 目录中创建文件。如 清单 10 所示,该组的其他成员无法更新文件 gretchen.txt。但是,他们拥有该目录的写权限,因此可以删除该文件。

清单 10. sgid 访问模式和文件所有权

[jenni@attic4-cent ~]$ su - mary Password:  [mary@attic4-cent ~]$ echo "something" >> ~greg/lpi101/jenni.txt -bash: /home/greg/lpi101/jenni.txt: Permission denied [mary@attic4-cent ~]$ rm ~greg/lpi101/jenni.txt rm: remove write-protected regular empty file `/home/greg/lpi101/jenni.txt'? y [mary@attic4-cent ~]$ ls -l ~greg/lpi101 total 0

粘滞位

您刚看到了拥有一个目录的写权限的用户如何删除其中的文件。这对组项目而言是可以接受的,但它对全局共享的文件空间(比如 /tmp 目录)而言不太合意。幸运的是,有一个相关的解决方案。

剩余的访问模式位被称为 粘滞 位。它们在符号上由 t 表示,在数值上由高阶八进制数中的 1 表示。它在一个长目录清单中显示在其他用户的可执行标志中(最后一个字符),大写和小写对 suid 和 sgid 具有相同的含义。如果这个位是为一个目录设置的,它仅允许所有者用户或超级用户 (root) 删除或取消链接一个文件。清单 11 展示了用户 greg 如何在他的 lpi101 目录上设置粘滞位,还表明这个位是为 /tmp 设置的。

清单 11. 粘滞目录

[greg@attic4-cent ~]$ chmod +t lpi101 [greg@attic4-cent ~]$ ls -ld lpi101 /tmp drwxrwsr-t.  2 greg development 4096 Aug  9 06:51 lpi101 drwxrwxrwt. 42 root root        4096 Aug  9 06:53 /tmp

在过去,UNIX® 系统习惯于在文件上使用粘滞位来将可执行文件存放在交换空间中,避免重新加载。在现代 Linux 内核中,如果已为文件设置了粘滞位,则会忽略它。

访问模式摘要

表 3 总结了这里讨论的 3 种访问模式的符号和八进制表示。

表 3. 访问模式

访问模式 符号 八进制
suid s with u 4000
sgid s with g 2000
sticky t 1000

将此信息与之前的权限信息相结合,您就可以看到与 greg 的 lpi101 权限对应的完整的八进制表示,而且 drwxrwsr-t 的访问模式为 3775。尽管 ls 命令未显示八进制权限,但您可以使用 find 命令来显示它们,如 清单 12 所示

清单 12. 打印符号和八进制权限

[greg@attic4-cent ~]$ find . -name lpi101  -printf "%M %m %f/n" drwxrwsr-t 3775 lpi101

不可变的文件

访问模式和权限对谁可以对文件和目录执行哪些操作提供了全面的控制。但是,它们无法阻止 root 用户因疏忽而删除文件的情况。尽管这超出了 LPI 主题 104.5 的范畴,但各种文件系统上还有其他一些 属性 提供了额外的功能。其中一个是 immutable 属性。如果设置了该属性,在取消设置它之前,即使 root 用户也无法删除文件。

可以使用 lsattr 命令查看是否为一个文件或目录设置了不可变标志(或其他任何属性)。要让文件不可变,可以使用 chattr 命令和 -i 标志。

清单 13 表明用户 root 可以创建一个不可变文件,但只有在删除了不可变标志后,才能删除它。

清单 13. 不可变的文件

[root@attic4-cent ~]# touch keep.me [root@attic4-cent ~]# chattr +i keep.me [root@attic4-cent ~]# lsattr keep.me ----i---------- keep.me [root@attic4-cent ~]# rm -f keep.me rm: cannot remove `keep.me': Operation not permitted [root@attic4-cent ~]# chattr -i keep.me [root@attic4-cent ~]# rm -f keep.me

更改不可变标志需要 root 权限,或者至少需要 CAP_LINUX_IMMUTABLE 功能。将文件设置为不可变通常是在安全检测或入侵检测工作中完成。请参阅 capabilities 手册页 ( man capabilities ) 了解有关的更多信息。

文件创建掩码

创建新文件时,创建进程会指定新文件应拥有的权限。通常,请求的模式为 0666,它使该文件可由任何人读和写。目录的模式默认情况下通常为 0777。但是,这种宽容性创建会受到一个 umask 值的影响,该值指定用户 想向新创建的文件或目录自动授予哪些权限。系统使用 umask 值来减少最初请求的权限。您可以使用 umask 命令查看 umask 设置,如 清单 14 所示。

清单 14. 显示八进制 umask

[ian@attic4-cent ~]$ umask 0002

请记住,umask 指定哪些权限 应授予。在 Linux 系统上,用户没有私有组,umask 默认情况下通常为 0022,这会从新文件中 删除 组和其他写权限。在用户拥有私有组时(就像这些示例中使用的 CentOS 系统上一样),umask 默认情况下通常为 0002,这会删除其他用户的写权限。可以通过使用 -S 选项,显示哪些权限 允许的形式符号性地显示 umask。

可以使用 umask 命令设置 umask 和显示它。所以,如果您想让您的文件更加私有,并禁止所有组或其他用户访问新创建的文件,可以使用 umask 值 0077。或者使用 umask u=rwx,g=,o= 以符号方式设置它,如 清单 15 所示。

清单 15. 设置 umask

[ian@attic4-cent ~]$ umask -S u=rwx,g=rwx,o=rx [ian@attic4-cent ~]$ umask u=rwx,g=,o= [ian@attic4-cent ~]$ umask 0077 [ian@attic4-cent ~]$ touch newfile [ian@attic4-cent ~]$ ls -l newfile -rw-------. 1 ian ian 0 Aug  9 07:09 newfile

请记住,新创建的文件的默认权限为 0666,而且 umask 值指定其中哪些位应删除(屏蔽掉)。所以如果您想要执行权限,必须将它显式添加到文件中。

设置文件所有者和组

文件组

要创建一个文件的组,可以使用 chgrp 命令和一个组名及一个或多个文件名。如果愿意的话,还可以使用组成员。普通用户必须拥有该文件,而且还是该文件组更改的目标组的成员。root 用户可以将文件更改到任何组。清单 16 显示了一个示例。

清单 16. 更改组所有权

[ian@attic4-cent ~]$ touch file{1,2} [ian@attic4-cent ~]$ ls -l file* -rw-rw-r--. 1 ian ian 0 Aug  9 07:16 file1 -rw-rw-r--. 1 ian ian 0 Aug  9 07:16 file2 [ian@attic4-cent ~]$ chgrp development file1 [ian@attic4-cent ~]$ chgrp 1002 file2 [ian@attic4-cent ~]$ ls -l file* -rw-rw-r--. 1 ian development 0 Aug  9 07:16 file1 -rw-rw-r--. 1 ian development 0 Aug  9 07:16 file2

与本教程中介绍的许多命令一样, chgrp 提供了一个 -R 选项,允许以递归方式向所有选择的文件和子目录应用更改。

默认组

您在学习时,已经知道如果在目录上设置 sgid 模式,则会导致在该目录中创建的新文件属于创建该文件的用户。

您还可以使用 newgrp 命令临时将您的主要组更改为您所属的另一个组。这将创建一个新的 shell,而且在退出该 shell 时,以前的组将恢复原状,如 清单 17 所示。

清单 17. 可以使用 newgrp 临时更改默认组

[ian@attic4-cent ~]$ groups ian development editor [ian@attic4-cent ~]$ newgrp development [ian@attic4-cent ~]$ groups development ian editor [ian@attic4-cent ~]$ touch file3 [ian@attic4-cent ~]$ ls -l file3 -rw-r--r--. 1 ian development 0 Aug  9 07:21 file3 [ian@attic4-cent ~]$ exit exit [ian@attic4-cent ~]$ groups ian development editor

文件所有者

root 用户可以使用 chown 命令更改文件的所有权。在最简单的形式中,它的语法类似于 chgrp 命令,但使用了用户名或数值 ID 来代替组名称或 ID。此外,您还可以更改该文件的组,只需在用户名或 ID 后添加一个冒号和一个组名称或 ID。如果只提供了一个冒号,那么将使用用户的默认组。自然地, -R 选项将递归地应用更改。清单 18 显示了一个示例。

清单 18. 使用 chown 更改文件所有权

[ian@attic4-cent ~]$ touch file4 [ian@attic4-cent ~]$ su - Password:  [root@attic4-cent ~]# ls -l ~ian/file4 -rw-rw-r--. 1 ian ian 0 Aug  9 07:27 /home/ian/file4 [root@attic4-cent ~]# chown greg ~ian/file4 [root@attic4-cent ~]# ls -l ~ian/file4 -rw-rw-r--. 1 greg ian 0 Aug  9 07:27 /home/ian/file4 [root@attic4-cent ~]# chown jenni:mary ~ian/file4 [root@attic4-cent ~]# ls -l ~ian/file4 -rw-rw-r--. 1 jenni mary 0 Aug  9 07:27 /home/ian/file4 [root@attic4-cent ~]# chown :jenni ~ian/file4 [root@attic4-cent ~]# ls -l ~ian/file4 -rw-rw-r--. 1 jenni jenni 0 Aug  9 07:27 /home/ian/file4

一种指定用户和组的较旧的形式使用了句点来代替冒号。已不再推荐这么做,因为它可能在名称包含句点时导致混淆。

Linux 上的文件和目录权限的介绍到此就结束了。

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » 学习 Linux,101: 管理文件权限和所有权

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址