无意中看见某文件夹是drwx-wx-wt, 发现不知道t是啥意思, 所以去问google先生。
先ls -la来看普通的文件和文件夹。
-rwxr-xr-x 1 twd2 twd2 7940 Jul 14 08:33 .bash_history
drwxr-xr-x 2 twd2 twd2 4096 Jul 12 09:09 .cache
把它分成4份来看, 使用”|”分割。
-|rwx|r-x|r-x
d|rwx|r-x|r-x
第一份说明是文件(-)文件夹(d)或链接(l), 其他的就不知道了。
第二份是用来说明该文件(夹)所有者对这个文件(夹)的权限,
对于文件: r代表读(Read), w代表写(Write), x代表执行(eXecute), -代表没有对应位置的权限。
对于文件夹: r代表列出目录下内容, w代表可以删除/重命名, x代表访问目录里内容(没有r权限但是知道路径也行), -代表没有对应位置的权限。
第三份说明该文件(夹)所属组的用户对这个文件(夹)的权限, rwx-的意思同上。
第四份说明该文件(夹)所属组的用户以外的用户对这个文件(夹)的权限, rwx-的意思同上。
然后你会发现passwd这个程序的权限是这样的:
-rwsr-xr-x 1 root root 42824 Sep 12 2012 /usr/bin/passwd
s又是什么!
对于文件
s代表suid/sgid, 在第二份的时候就是suid, 第三份就是sgid。
如果第二份出现了s, 说明无论哪个用户执行, 执行该文件的用户都会是该文件的所有者。
如果第三份出现了s, 说明无论哪个用户执行, 执行该文件的用户组都会是该文件的所有者的用户组。
好像第四份不会出现s。
根据如上说明, 我在执行passwd的时候其实是以root用户, twd2用户组。
root 2666 0.0 0.0 56920 1780 pts/2 S+ 17:50 0:00 passwd
用户组看不出来o.o
其实Linux中有s的文件不多, 这里列出3个目录下的。
root@WandaiServer:~# ls -la /bin/ | grep rws
-rwsr-xr-x 1 root root 94792 Mar 30 2012 mount
-rwsr-xr-x 1 root root 35712 Nov 8 2011 ping
-rwsr-xr-x 1 root root 40256 Nov 8 2011 ping6
-rwsr-xr-x 1 root root 36832 Sep 12 2012 su
-rwsr-xr-x 1 root root 69096 Mar 30 2012 umountroot@WandaiServer:~# ls -la /sbin/ | grep rws
-rwsr-xr-x 1 root root 18896 Feb 5 18:24 mount.ecryptfs_privateroot@WandaiServer:~# ls -la /usr/bin/ | grep rws
-rwsr-sr-x 1 daemon daemon 47928 Oct 25 2011 at
-rwsr-xr-x 1 root root 41832 Sep 12 2012 chfn
-rwsr-xr-x 1 root root 37096 Sep 12 2012 chsh
-rwsr-xr-x 1 root root 63848 Sep 12 2012 gpasswd
-rwsr-xr-x 1 root root 32352 Sep 12 2012 newgrp
-rwsr-xr-x 1 root root 42824 Sep 12 2012 passwd
-rwsr-xr-x 2 root root 71288 Feb 27 20:54 sudo
-rwsr-xr-x 2 root root 71288 Feb 27 20:54 sudoedit
对于目录
如果一个目录的第三份设置了s的话说明在该目录下创建的文件所属的组会继承该目录所属的组。
twd2@WandaiServer:~$ ls -la
……
drwsrwsrwx 2 root root 4096 Jul 14 18:06 hello
……twd2@WandaiServer:~$ cd hello/
twd2@WandaiServer:~/hello$ ls -la
total 8
drwsrwsrwx 2 root root 4096 Jul 14 18:07 .
drwx–x–x 8 twd2 twd2 4096 Jul 14 18:05 ..twd2@WandaiServer:~/hello$ touch aaaaaa
twd2@WandaiServer:~/hello$ ls -la
total 8
drwsrwsrwx 2 root root 4096 Jul 14 18:07 .
drwx–x–x 8 twd2 twd2 4096 Jul 14 18:05 ..
-rw-rw-r– 1 twd2 root 0 Jul 14 18:07 aaaaaa
第二份中设置s好像没什么效果。
然后你会说, s不是把x原来的位置占掉了么, 那怎么办呢。
聪明的设计者使用了大小写来区分:
s表示原来设置了x权限, S表示原来没有x权限。
然后我们来看看t,
前面说到如果一个用户拥有了一个目录的w权限, 那么他可以对这个目录进行删除或重命名, 看起来好像没什么问题。
但是对于存放临时文件的目录, 需要所有用户都可以对其进行写入的, 如果一个用户把这个存放临时文件的目录给删掉了, 会造成不可估量的灾难, 比如php的session目录。
伟大的设计者发明了一种叫做sTicky的东西。
带有t标志(它一般出现在第四份的x的位置)的目录, 只允许该目录所有者或被操作对象的所有者对这个目录内的内容进行删除或重命名。
但是所有有这个目录w权限的用户, 都可以删除这个目录, 只要目录是空的。
twd2@WandaiServer:~$ ls -la
……
drwxrwxrwt 2 root root 4096 Jul 14 18:19 hello
drwxrwxrwx 2 root root 4096 Jul 14 18:19 hello2
……twd2@WandaiServer:~$ ls -la hello{,2}
hello:
total 8
drwxrwxrwt 2 root root 4096 Jul 14 18:19 .
drwx–x–x 9 twd2 twd2 4096 Jul 14 18:19 ..
-rw-r–r– 1 root root 0 Jul 14 18:19 aaahello2:
total 8
drwxrwxrwx 2 root root 4096 Jul 14 18:19 .
drwx–x–x 9 twd2 twd2 4096 Jul 14 18:19 ..
-rw-r–r– 1 root root 0 Jul 14 18:19 aaatwd2@WandaiServer:~$ rm hello{,2}/aaa
rm: remove write-protected regular empty file `hello/aaa’? y
rm: cannot remove `hello/aaa’: Operation not permitted
rm: remove write-protected regular empty file `hello2/aaa’? ytwd2@WandaiServer:~$ ls -la hello{,2}
hello:
total 8
drwxrwxrwt 2 root root 4096 Jul 14 18:19 .
drwx–x–x 9 twd2 twd2 4096 Jul 14 18:19 ..
-rw-r–r– 1 root root 0 Jul 14 18:19 aaahello2:
total 8
drwxrwxrwx 2 root root 4096 Jul 14 18:21 .
drwx–x–x 9 twd2 twd2 4096 Jul 14 18:19 ..root@WandaiServer:~# cd hello/
root@WandaiServer:~/hello# rm aaa
root@WandaiServer:~/hello# exit
exittwd2@WandaiServer:~$ rmdir hello/
twd2@WandaiServer:~$ ls -la | grep hello
twd2@WandaiServer:~$
T和t就像S和s。
然后到了神奇的数字表示法:
如上所有的权限可以用最多4位(最大7777)的八进制数表示(据计算一共可以表示4096种>w<)。
第一位: suid为4, sgid为2, t为1。
第二、三、四位: r为4, w为2, x为1。
对于每位的多种权限组合只要把对应的数字相加, 比如rwx是7, r-x是5, rw-是6。
例如,
7777代表rwsrwsrwt,
1234代表-w–wxr-T,
4321代表-ws-w—x,
7000代表–S–S–T,
0代表———。
如上, 我们可以使用chmod来设置权限, 具体用法请man chmod。
简单的说就是
chmod [-R] 数字 对象 (-R说明是递归设置该目录下的所有子目录及文件
chmod [-R] [ugoa][+-=][rwxst] 对象 (u代表所有者, g代表所属组, o代表其他, a代表所有即a等效ugo
chmod不可以改变符号链接的权限。
Linux仅仅用了12个二进制为来表示千变万化的文件权限, 比起Windows的权限, 虽然功能弱了一些, 但也不是更容易理解和设置吗?
发表评论