Linux 中的权限
普通权限
Linux 的权限分为三部分,第一部分是所有者权限,第二部分是所属组权限,第三部分是其他人权限:
主 组 他
rwx rwx rwx
其中 r
代表可读,w
代表可写,x
代表可执行(或搜索目录),它们都有对应的数字:
r = 4
w = 2
x = 1
各部分的 rwx
权限可以用上面的数字相加来表示:
rwx = 4+2+1 = 7
rw- = 4+2 = 6
r-x = 4+1 = 5
-wx = 2+1 = 3
所以三部分权限就可以用三个数字来表示:
755 = rwx r-x r-x
644 = rw- r-- r--
特殊权限
除了这些权限之外,还有三个特殊权限:
setuid = 4
setgid = 2
sticky = 1
setuid
表示允许其它用户以文件所有者的身份执行该文件(如果所有者有可执行权限的话),比如普通用户以 root
用户的身份执行某个程序。对目录没有效果。
setgid
表示允许其它用户以文件所属组的身份执行该文件(如果所属组有可执行权限的话),对于目录而言,则表示所有用户在该目录中创建的文件或目录,其所属组与该目录相同,主要用于在目录中共享资源,同一个组中的成员可以自由访问其中的数据。
sticky
对于目录而言,只允许所有者或特权用户删除或重命名其中的文件,这称为目录的“受限删除标志”,通常用在 /tmp
目录上。对于某些旧系统上的普通文件,该标志将文件保存在交换设备上,以便在运行时更快地加载,这称为“粘滞位”,不过现代的系统本身就有缓存机制,不用粘滞位也会被缓存,所以粘滞位已经不再文件上使用,只在目录上使用。
对于设置了 setuid
(或 setgid
)的文件或目录,如果其“所有者”(或“所属组”)有可执行权限,则会使用 s
标志代替 x
标志,如果没有可执行权限,则会使用大写的 S
标志代替。
对于设置了 sticky
的文件或目录,如果“其他人”有可执行权限,则会用 t
标志代替 x
标志,如果没有可执行权限,则会使用大写的 T
标志代替。
设置权限
# u 代表用户,g 代表组,o 代表其他,a 代表全部
# - 代表去掉,+ 代表增加,= 代表设置
# r 代表读,w 代表写,x 代表执行
# X 代表仅当文件是目录或已对某些用户具有执行权限时才设置 x
# s 代表 setuid/setgid(看是设置个所有者还是所属组)
# t 代表 sticky
chmod [ugoa]*([-+=][rwxXst]*)+
chmod [ugoa]*([-+=][ugo])+
chmod [-+=][0-7]+
chmod 00755 file # 设置文件权限为 rwx r-x r-x,清除高级权限位
chmod =755 file # 设置文件权限为 rwx r-x r-x,清除高级权限位
chmod 755 file # 设置文件权限为 rwx r-x r-x,保留高级权限位
chmod 1755 file # 设置文件权限为 rwx r-x r-t
chmod 7777 file # 设置文件权限为 rws rws rwt
chmod 7666 file # 设置文件权限为 rwS rwS rwT
chmod +007 file # 为其他人添加 rwx 权限
chmod -022 file # 去掉所属组和其他人的 w 权限
chmod u+rw file # 为所有者 rw 权限
chmod ug+rw file # 为所有者和所属组添加 rw 权限
chmod a+x-w file # 为所有人添加 x 权限,去掉 w 权限
chmod a=rx file # 将所有人的权限设置为 rw
chmod o=g file # 将其他人的权限设置为与所属组相同
chmod +rwx file # 为所有者添加 rwx 权限,为所属组和其他人添加 r-x 权限
chmod
从不改变符号链接的权限,因为符号链接的权限从不使用。但是,对于“命令行”中给出的符号链接,chmod
会更改其所指向的文件的权限。而在遍历目录(通过 -R 选项)时遇到的符号链接,chmod
会忽略它。
高级权限
其它特殊权限:
chattr +i file # 忽略 w 权限设置,任何人不可修改
chattr -i file # 恢复 w 权限设置
chattr +i file # 忽略 w 权限设置,任何人只能追加数据
chattr -i file # 恢复 w 权限设置
更多 chattr
选项:
chattr [-pRVf] [-+=aAcCdDeijPsStTuF] [-v version] files...