Linux里面的权限比较详细的小记

无意中看见某文件夹是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 umount

root@WandaiServer:~# ls -la /sbin/ | grep rws
-rwsr-xr-x 1 root root 18896 Feb 5 18:24 mount.ecryptfs_private

root@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 aaa

hello2:
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 aaa

twd2@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’? y

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 aaa

hello2:
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
exit

twd2@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的权限, 虽然功能弱了一些, 但也不是更容易理解和设置吗?

发表评论

注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)

本文链接:https://twd2.me/archives/4381QrCode