对Linux/Unix文件权限的理解
今天我才知道,在 Linux 和 Unix 系统中,对于目录来说,x
位意味着搜索和访问目录,这与文件的 x
权限是完全不同的。具体来讲,对于存放网站的目录,应该将其所有者设置为与 apache 相同的用户名和所属组(通常是 www
),文件所有者的权限设置为 1
即可,这样网站既能正常访问,又能防止使用 webshell 对当前目录进行列表或遍历操作。
一直以来,我都错误地将文件夹的 r
权限理解为列表访问,现在才明白原来是目录的 x
权限才表示搜索和访问目录,真是惭愧啊……
chmod 操作后的文件权限数字 mod
是八进制的,这样正好可以用四位八进制数来表示一个文件或目录的所有权限。例如,0400
可以表示为 000 100 000 000
,其中 b
表示文件属主可读,最高位可以不用太在意,主要是设置 u
位的。
以下是计算权限值的方法:
------------------------------------------------------------------
| 文件属主 | 同组用户 | 其他用户 |
------------------------------------------------------------------
| r w x r w x r w x |
| 4 + 2 + 1 4 + 2 + 1 4 + 2 + 1 |
------------------------------------------------------------------
是不是很简单呢?
此外,有些文件还具有一些特殊的权限设置:
一、特殊权限说明
(一)setuid
setuid 权限可以使文件在执行阶段具有文件所有者的权限。典型的例子是 /usr/bin/passwd
文件,如果普通用户执行该文件,在执行过程中,该文件可以获得 root 权限,从而可以更改用户的密码。
(二)setgid
setgid 权限仅对目录有效。当目录被设置该权限后,任何用户在此目录下创建的文件都将具有和该目录所属组相同的组。
(三)sticky bit
sticky bit 可以理解为防删除位。一个文件是否可以被某个用户删除,主要取决于该文件所属组对该用户是否具有写权限。如果没有写权限,那么这个目录下的所有文件都不能被删除,也不能添加新的文件。如果希望用户可以添加文件但不能删除文件,那么可以对文件使用 sticky bit 权限。设置该权限后,即使用户对目录具有写权限,也不能删除该文件。
二、文件权限与所属关系
因为每个文件都有一个所有者,表示该文件是由谁创建的,同时,该文件还有一个组编号,表示该文件所属的组,一般为文件所有者所属的组。对于可执行文件,在执行时,通常该文件仅拥有调用该文件的用户的权限,而 setuid 和 setgid 可以改变这种设置。
三、改变特殊权限的方法
以下是改变文件或目录特殊权限的方法:
chmod u+s temp -- 为 temp 文件加上 setuid 标志。(只对文件有效)
chmod g+s tempdir -- 为 tempdir 目录加上 setgid 标志。(只对目录有效)
chmod o+t temp -- 为 temp 文件加上 sticky 标志。(只对文件有效)
用权限位的数字表示如下:
4000 setuid bit
2000 setgid bit
1000 sticky bit
还有一种专门针对文件夹或修改权限的方便方法:
find. -type d -exec chmod 155 {} ; (修改目录权限)
find. -type f -exec chmod 644 {} ; (修改文件权限)