在Linux的
stat
结构体中,st_mode
成员包含16位,其中4位用作文件类型,9位用作权限,剩下3位用作文件特殊属性。
suid位
- 第一位叫做 set-user-ID位,它解决了这样一个问题:用户如何修改自己的密码。
似乎直接使用passwd
即可。但passwd背后的原理是:passwd修改/etc/passwd
这个文件但请注意这个文件的权限
可以看到,只有root用户才有对这个文件的写权限,那普通用户是怎么修改自己的密码呢?Linux的做法是,不给普通用户修改这个文件的权限,而是给passwd命令一个特殊权限,即SUID,它会告诉内核,运行这个程序的时候认为是命令的所有者在执行命令,这里就是root,而root有修改密码权限。
如果设置了suid,所有者的可执行位上被替换成s
- 这里似乎潜在一个问题,既然passwd的SUID位赋予了普通用户以root身份来执行修改密码操作,那么能不能修改其他用户的密码呢?毕竟root无所不能嘛。这当然是不行的,因为passwd的实现里调用了
getuid
来得到当前用户的uid,只允许它修改这个uid对应的用户,也就是自己。
如果设置了sgid,组用户的可执行位上被替换成s
sgid
第二个特殊属性是用来程序运行时的所属组。如果一个程序所属的组被设置为g,且set-group-ID位也被设置,那么程序运行时,就好像它正在被g组中的某一用户运行一样。set-group-ID为给程序某一个组的访问权限。
粘滞位 (sticky bit)
粘滞位对于文件和目录有不同的用途。
对于文件而言,由于内存有限,使用交换技术。从交换空间装载程序要比从普通硬盘快,在非交换空间的硬盘上,程序可能被分成好几块存放在好几个地方,交换空间上的文件是不分块的。sticky位告诉内核即使没有人在使用程序,也要把它放在交换空间中。现在,交换技术用得少了,取而代之的是虚拟内存技术,虚拟内存使用更小单位的页,进行交换。
对于目录而言,有些目录被设计用来存放临时文件,如/tmp,任何人都可以在这里创建、删除文件,但是只有创建者才能删除目录里的文件。
如果设置了粘滞位,其他用户的可执行位被替换成t