每个文件和文件夹有三种用户许可类型:

    • 所有者 (使用符号 “user”首字母);

    • 所有者组(使用符号 g “group”首字母),代表组中的所有成员;

    有三种可以相互结合的权限类型:

    • 读取(使用符号 r “read”的首字母);

    • 写(使用符号 w “write”的首字母);

    以文件来说,其权利较容易理解:读取就是允许读取其内容 (包括复制)、写入就是允许改变它、而运行就是跑它 (文件本身必须是程序)。

    安全 setgid 目录和 粘着位

    由于 setuid 根程序在系统层以超级用户的身份运行,有必要确定其安全性和可靠性。实际上,如果用户可以侵入该程序并调用自己设定的命令,就有可能伪装成超级用户并获取系统的所有权限。

    文件夹的处理方式略有不同。读取其条目 (文件及文件夹)、写入包括添加与删除文件、而运行则是进入它 (尤其是使用 cd 命令)。进入文件夹而不必有读取权限,运行已知的文件名,若不知其正确的名称,则无法运行。

    安全 setgid 目录和 粘着位

    setgid 位也适用于目录。在这种目录中新创建的条目会被自动赋予其父目录的所有组,而不是通常情况下那样继承创建者的主用户组。这种设置可以避免几个同组用户在共享文件树中协同工作时(为保持所创建文件的所有组的一致性)而不得不改变自身主用户组的额外工作(使用 newgrp 命令)。

    “粘着”位(使用符号“t”)是仅用于目录的许可位。专门用于所有人都有写权限的临时目录(例如 /tmp/):它严格限制删除操作,只有所有者(或者父目录的所有者)可以删除。少了它,所有人都能删除其他用户在 /tmp/中的文件。

    有三个控制文件许可权限的命令:

    • 命令更改文件的所有者;

    • chgrp *组* *文件* 改变所有组

    有两种方法表示权限。其中,符号表示是最易于理解和记忆的。它使用前述的符号链接。可以通过显示的设置(u/g/o),通过加(+),或者减(-)定义每种用户的权限类型。一个 u=rwx,g+rw,o-r 格式的命令会赋予所有者读,写和执行权限,给所有组添加读写权限,移除其他用户的读权限。其他命令中未通过加或者减列出的权限保持不变。字母 a是指“所有”,涵盖三种类型的用户,因此 a=rx 命令会赋予三种用户相同的权限(读和执行,没有写)。

    比如, chmod 754 *file* 会设置如下的权限:所有者读,写和执行(由于7 = 4 + 2 + 1);所有组读和执行(由于 5 = 4 + 1);其他用户只读。 0 意味着没有任何权限;因此 chmod 600 *file* 允许所有者读写,而其他人没有任何权限。对可执行文件和目录,最常用的权限组合是 755 ,对数据文件是 644

    要表示特殊权限,可以根据同样的原则在数字上加入第四个前缀位,位 , setgidsticky 分别对应4,2,和1。chmod 4754 会设置前面描述的 setuid 位权限。

    八进位标记只适用于对文件的一次性设置所有权限;不能以它加入新的权限,如群组拥有者的读取,因为必须把现在的权限与计算新的数值。

    提示 递归操作

    有时需要更改整个文件树的权限。以上所有的命令都有 -R 选项来递归操作子目录。

    文件夹与文件的不同,有时造成递归运算的问题。所以,在符号式权限里加入 “X” 字母。它代表只对文件夹 (不是文件) 的运行权。因此,chmod -R a+X *directory* 对至少一个范畴用户 (即使只有一个拥有者) 已经有运行权的所有次文件夹与文件,只对所有范畴用户加入运行权 (a)。

    提示 改变组和用户

    通常在改变拥有者的时候,也要改变文件的群组。chown 命令有个特别的语法,用在这个时机:chown *user*:*group* *file*

    进阶 umask

    当应用程序创建文件的时候,它指定许可权限,而系统则会根据 umask命令的内容,自动地移除某些权限。在命令界面输入 umask :会看到类似 0022的掩码。这是一个八进制数代表了会被系统移除的权限(在本例中,是指对所有组和其他用户的写权限)。