Linux下的文件/目录有三类权限:一般权限、特殊权限、隐藏权限
关于权限与归属的认识(三张图)
访问权限/一般权限:r w x
1.对目录而言rwx的意义是?
r:意味着具有读取目录结构列表的权限。即能够使用ls命令
$ ll dr--------. 2 lyj01 lyj01 4096 7月 7 09:59 test1
$ cd test1/ ------>#只有r权限是没有办法cd进入目录的 bash: cd: test1/: 权限不够
$ ls test1/ ls: 无法访问test1/2.txt: 权限不够 ls: 无法访问test1/1.txt: 权限不够 1.txt 2.txt ------>#有r权限我们可以看到目录下的内容
w:意味这具有更改目录结构列表的权限。即可以:
新建(touch/vim)文件与目录;
删除(rm)文件与目录(且不论该文件与目录权限是什么);
重命名(mv)文件与目录;
移动(cp)文件与目录;
$ ll drwx------. 2 lyj01 lyj01 4096 7月 7 10:03 test1
$ cd test1/
$ ls 1.txt 2.txt
$ rm 1.txt ------>#可以删除
$ touch 3.txt ------>#可以新建
$ mv 3.txt 1.txt ------>#可以重命名
$ cp 1.txt /test/ ------>#可以移动
$ cd test1
$ ll dr--------. 2 lyj01 lyj01 4096 7月 7 10:24 test2 -r--------. 1 lyj01 lyj01 0 7月 7 10:24 test3
------>#虽然这个目录中的文件(test3)和目录(test2)只有r权限
$ rm test2 -r rm:是否删除有写保护的目录 "test2"?y
$ rm test3 -r rm:是否删除有写保护的普通空文件 "test3"?y
------>#但是无论test1目录下的"文件/目录权限如何",因为父目录test1有w权限,其下的文件/目录就可以执行相应操作
------>#我们得知道这意味着什么? $ pwd /home/lyj01
$ ll -d /home/lyj01 drwx------. 3 lyj01 lyj01 1024 7月 7 09:54 /home/lyj01 ------>#对一个用户的家目录来说,这个家目录的属主属组都是属于这个用户的,且属主权限为755
$ touch 1.txt
$ sudo chown root:root 1.txt
$ sudo chmod 700 1.txt ------>#我们尝试着在这个家目录下创建一个属主属组为root且权限为700的文件
$ ll -rwx------. 1 root root 0 7月 7 10:33 1.txt ------>#照这个权限设置来说,用户lyj01属于others,并没有对这个文件的任何权限
$ rm 1.txt -f ------>但是我们可以删除它,为什么?想想这个家目录的权限是怎样? ------>#所以说用户在它用户家目录里面具有如同"root"般的地位
------>#另外必须强调的一点是,如果目录没有x权限来让你具有切换到该目录下的权限,那么w权限是没有意义的 $ ll drw-------. 2 lyj01 lyj01 4096 7月 7 10:10 test1
$ cd test1/ bash: cd: test1/: 权限不够
$ touch test1/3.txt touch: 无法创建"test1/3.txt": 权限不够
x:意味着具有能够进入该目录成为工作目录的权限。即可以使用cd命令
$ ll dr-x------. 2 lyj01 lyj01 4096 7月 7 10:03 test1
$ cd test1/ ; ls ------>#能够cd进入目录 1.txt 2.txt
$ rm 1.txt rm: 无法删除"1.txt": 权限不够 ------>#但是因为没有w权限,所以进入目录以后也不能做什么
$ touch 3.txt touch: 无法创建"3.txt": 权限不够
2.对文件而言rwx的意义是?
r:意味着具有读取该文件内容的权限
$ ll -r--------. 1 lyj01 lyj01 13 7月 7 10:39 1.txt
$ cat 1.txt hello world!
w:意味着具有编辑、新增、修改文件的权限
x:如果是脚本文件意味这可以被系统执行
注意:对于文件而言,其r、m、x权限都针对的是该“文件的内容”而言的,而对于“文件名”本身的操作(例如删除、重命名等)权限是没有意义的。这个结合上面权限对于目录而言的意义就很好理解了
特殊权限:SUID、SGID、SBTI
1.SUID/SGID
#看一下这三个文件的权限
# ls -l /usr/bin/passwd /etc/shadow /etc/passwd -rw-r--r-- 1 root root 1470 Jun 22 19:33 /etc/passwd ---------- 1 root root 902 Jun 22 19:33 /etc/shadow -rwsr-xr-x. 1 root root 30768 Feb 22 2012 /usr/bin/passwd
我们知道,/etc/passwd和/etc/shadow存放着用户的账户和密码信息。从它们俩的权限上看,普通用户(others)并不具有对它们修改的权限。
但实际上,普通用户登录的状态下,它是可以通过/usr/bin/passwd这个命令来修改自己的密码的。这是为什么呢?
我们可以看到/usr/bin/passwd文件的root权限设置为rws,即具有SUID权限。普通用户就可以通过执行passwd命令,临时的拥有root权限,去修改/etc/passwd文件了
所以总结来说:
若普通用户对于该文件有执行权限(x)的前提下;
SUID就是:让普通用户拥有可以执行“只有root权限才能执行”的特殊权限,SGID同理指”组“;
SUID仅能用在二进制程序(binary program)上,对目录无效。
查询整个系统的SUID/SGID文件?
# find / -perm +6000
2.SBTI(Sticky Bit)粘滞位权限
# mkdir /test
# chmod 1777 /test/ ------>#使该目录对所有用户可读写,并增加SBTI权限
# ll -d /test/ drwxrwxrwt 2 root root 4096 Jul 11 23:49 /test/
假设该/test目录是对所有用户开放共有的目录,且所有用户都拥有读写权限,
若A用户在/test中创建了一个文件,B用户哪天不爽它还有权限去删掉这个文件,这肯定是不好的。
但是设置了sticky bit权限以后是不会出现这样的问题的
# su lyj ------>#切换普通用户lyj
$ touch lyj1.txt ------>#创建一个文件
$ ll lyj1.txt -rw-rw-r-- 1 lyj lyj 0 Jul 11 23:52 lyj1.txt
# su lyj2 ------>#切换普通用户lyj2
$ ls lyj1.txt
$ rm lyj1.txt -f ------>#lyj2有权删掉这个lyj创建的文件吗? rm: cannot remove `lyj1.txt': Operation not permitted #显然不能
$ touch lyj2.txt
$ rm lyj2.txt -f ------>#它只能删除自己创建的
所以总结来说:
若普通用户对于该目录有w、x权限的前提下;
SBTI意味着,当该普通用户在该目录下创建了文件/目录,那么只有它自己和root用户可以删除/重命名/移动它,其他用户没有权力这么做;
SBTI只针对目录有效
隐藏权限:attrt
i:可以让文件不能被删除、重命名;不能写入、添加数据;不能创建硬链接;注意只有root用户有权设置此权限
# touch attrtest
# chattr +i attrtest ------>#给文件添加隐藏权限i
# lsattr attrtest ------>#查看文件的隐藏权限 ----i--------e- attrtest
# whoami root
# rm attrtest -f rm: 无法删除"attrtest": 不允许的操作 ------>#哪怕root用户都不能删除
# echo "hello" > attrtest ------>#不能写入/修改 -bash: attrtest: 权限不够
# mv attrtest attrtest2 ------>#不能重命名 mv: 无法将"attrtest" 移动至"attrtest2": 不允许的操作
# ln attrtest 2 ------>#不能创建硬链接 ln: 创建硬链接"2" => "attrtest": 不允许的操作
# ln -s attrtest 1.txt
# cat attrtest ------>查看和创建软链接倒是可以
a:让这个文件只能增加数据,不能删除、修改数据;注意只有root用户有权设置此权限
# chattr +a attrtest
# lsattr attrtest -----a-------e- attrtest
# echo "hello" > attrtest -bash: attrtest: 不允许的操作
# echo "hello" >>attrtest ------>#注意体会 > 和 >> 的不同
# cat attrtest hello
# rm attrtest -f rm: 无法删除"attrtest": 不允许的操作