平时授予文件权限都是使用 chmod 777
这样的命令来实现,最近看到了一种 chmod 0777
的写法,效果和 chmod 777
没什么差别,但是这一位又是合法的,很好奇多出来的第一位是什么作用,经过查询 new Bing
和文档,发现原来权限的标志位并不仅仅是只有 rwx 那么简单。
类似于后面的 777
,每个 7
都代表了转换为二进制 111
后对应 rwx
位的开关状态,上面第一位 0
也是代表了 3 个标志位的开关状态,分别是
set user ID (4)、set group ID (2)、sticky (1),0 说明都没有设置,7
说明全部开启。之所以后面表示用户、用户组和其他人权限用了
3 个数字,而这里只用 1 个数字是因为读、写、执行是需要针对用户、用户组、其他用户分别设置,而第一位是针对所有人设置的。
SUID
setuid 作用是当用户执行的时候,进程以所有者的 UID
运行,这样可以避免用户有当前文件的执行权限,但是没有执行过程中相关文件的权限,导致执行失败。比如修改密码的 passwd
命令,执行时需要修改系统文件,但是这个命令是所有人都可以执行的,那么没有修改系统文件权限的人也要能修改密码,所以 passwd
文件设置了 setuid
标志位,虽然修改密码的用户没有权限,但是 passwd
执行时是以文件所有者 root 权限执行的。
setuid 权限是体现在用户的执行权限位上的,平时显示 x
的标志位显示为 s
,如果文件的所属用户没有执行权限,则显示为大写的 S
。
1 | 4 对应下面的 s,755 对应 rwxr-xr-x |
SGID
setgid 的作用是,如果是作用于文件夹,则用户在该文件夹下创建的文件或目录的所属用户组继承该文件夹的所属用户组。如果是作用于文件,类似 setuid,文件执行时所属用户组不是执行用户的用户组,而是文件的所属用户组。使用场景是多个用户各自有各自的用户组,同时有属于一个组织的用户组,组织的工作空间可以通过设置 setgid 标志位来让用户共享工作空间中的内容,否则用户在工作空间下创建的内容都会默认为用户所属的用户组。
setgid 权限是体现在用户组的执行权限位上的,平时显示 x
的标志位显示为 s
,如果文件的所属用户组没有执行权限,则显示为大写的 S
。
1 | user1 属于 user1 和 organization 两个用户组 |
Sticky bit
sticky 标志位一般设置在目录上,设置了该标志位,目录中的内容只有 root 和所有者可以删除或移动,比如 /tmp 目录是所有用户放置临时文件的目录,所有人对目录都有写和执行权限,但是不能删除或移动其他用户的文件。
sticky 权限是体现在其他用户的执行权限位上的,平时显示 x
的标志位显示为 t
,如果文件的其他用户没有执行权限,则显示为大写的 T
。
1 | /tmp 目录设置有 sticky 标志位 |
以上,就是 chmod
命令中多出来的第一位的含义了。