每个文件和文件夹有三种用户许可类型:
所有者 (使用符号 “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
。
要表示特殊权限,可以根据同样的原则在数字上加入第四个前缀位,位 , setgid
和 sticky
分别对应4,2,和1。chmod 4754
会设置前面描述的 setuid
位权限。
八进位标记只适用于对文件的一次性设置所有权限;不能以它加入新的权限,如群组拥有者的读取,因为必须把现在的权限与计算新的数值。
提示 递归操作
有时需要更改整个文件树的权限。以上所有的命令都有 -R
选项来递归操作子目录。
文件夹与文件的不同,有时造成递归运算的问题。所以,在符号式权限里加入 “X” 字母。它代表只对文件夹 (不是文件) 的运行权。因此,chmod -R a+X *directory*
对至少一个范畴用户 (即使只有一个拥有者) 已经有运行权的所有次文件夹与文件,只对所有范畴用户加入运行权 (a
)。
提示 改变组和用户
通常在改变拥有者的时候,也要改变文件的群组。chown
命令有个特别的语法,用在这个时机:chown *user*:*group* *file*
进阶 umask
当应用程序创建文件的时候,它指定许可权限,而系统则会根据 umask
命令的内容,自动地移除某些权限。在命令界面输入 umask
:会看到类似 0022
的掩码。这是一个八进制数代表了会被系统移除的权限(在本例中,是指对所有组和其他用户的写权限)。