linux中对文件除了有读(r)、写(w)、执行(x)权限以外,还有3个特殊的权限,分别是setuid、setgid和stick bit



设置了suid的程序文件,在用户执行该程序时,用户的权限是该程序文件属主的权限。例如程序文件的属主是root,那么执行该程序的用户就将暂时获得root账户的权限。sgid与suid类似,只是执行程序时获得的是文件属组的权限。



例如我们使用root身份创建一个suid.sh文件

ls -l setuid.sh文件,可以看到文件的属主和属组都是root,文件的权限是-rw-------

wKiom1LHsVSxnGn7AAA5M6NAWxg842.jpg

再将/bin下的cat复制到tmp下,将权限使用chmod u+s cat添加suid。这样/tmp下的cat在执行时便让执行该命令的用户以该命令拥有者(root)的权限去执行”。

wKioL1LHsWnQg4plAAAxuLZsty0134.jpg

此时我们以一个普通用户openstack的身份登录去修改这个文件,由文件权限-rw-------可知openstack无法查看suid.sh这个文件。

wKiom1LHsaXB6LcvAAAsRNXmgqQ983.jpg


因此,我们可以使用/tmp/cat这个程序去查看,这样就可以查看suid.sh这个文件了。

wKioL1LHsguy57I2AAAm-8oxszA720.jpg


而sgid的意思和suid是一样的,即让执行文件的用户以该文件所属组的权限去执行。


这里特别强调 suid仅可用于二进制程序上,不能用于在shellscript上面,这是因为shell script只是将很多的二进制执行文件调用进来执行而已。所以suid的权限部分,还是得看shell script调用过来的程序的设置,而不是shell script本身,另外suid对目录也是无效的


sticky (粘贴位)仅对目录有效。


如果你查看/tmp目录的权限时,你会发现/tmp目录的权限是rwxrwxrwt权限,这就是sticky。



sticky (粘贴位)就是:除非目录的属主和root用户有权限删除它,除此之外其它用户不能删除和修改这个目录。


也就是说,在/tmp目录中,只有文件的拥有者和root才能对其进行修改和删除,其他用户则不行,避免了上面所说的问题产生。用途一般是把一个文件夹的的权限都打开,然后来共享文件,象/tmp目录一样。


如何设置这些特殊权限呢


   suid:chmod u+s 文件名


   sgid: chmod g+s 文件名


   sticky: chmod o+t 文件名

或者使用八进制方式表示


suid     guid    sticky


 1        1         1


suid的二进制串为:100,换算八进制为:  4


guid的二进制串为:010,换算八进制为:    2


sticky 二进制串:001,换算八进制为:1


于是也可以这样设:

suid:chmod 4644 文件名


sgid:chmod 2644 文件名


sticky:chmod 1644 文件名

而有时候我们会发现,文件使用suid或者sgid后文件后面有时候是S或者s,这里的区别是:

s:属主原有执行权限

S:属主无执行权限

同理T和t的区别同上。


此外文件特殊权限设置还有文件的acl:

我们使用root创建getfacl.txt,其中other的权限是r--,再以普通用户opentack身份登录并尝试修改此文件,会发现由于没有w权限,文件无法修改,那么如何才能修改呢?wKiom1LHtvGyh-apAAA4dMil8GM386.jpg

此时就可以用到我们的acl了。

查看文件的acl,使用getfacl +文件名来查看,

wKiom1LHtJLDy0k1AAAxKy-1Ej8603.jpg


设置facl使用格式

facl -m u:用户名:[rwx] 文件名

wKioL1LHtT-BBhV9AAA17RRWjKc815.jpg


为openstack添加rw权限后使用getfacl查看会发现此时多了一个条acl

wKiom1LHtc6wvyo8AABEJq30EmU344.jpg

再次切换到openstack用户后,向facl.txt写入hello world后,发现可以成功写入。

wKioL1LHteawfwUQAABABFSzEOE968.jpg