1.文件和目录权限
1.1 文件目录属性
Linux系统中文件和目录的属性主要有索引节点、类型、权限属性、链接数、所归属的用户和用户组、最近修改时间等内容。
[root@test2 ~]# ls -li 总计 23580 ……. 1966616 drwxr-xr-x 2 root root 4096 05-27 12:21 test 1876789 -rw-r--r-- 1 root root 14 05-23 00:07 test.txt |
inode |
类型 |
权限 |
链接数 |
用户 |
用户组 |
大小 |
修改时间 |
文件名 |
1966616 |
d |
rwxr-xr-x |
2 |
root |
root |
4096 |
05-27 12:21 |
test |
1876789 |
- |
rw-r--r-- |
1 |
root |
root |
14 |
05-23 00:07 |
Test.txt |
1.2索引节点
每个存储设备或存储的分区被格式化为文件系统后,都应该有两部分:一部分是inode,另一部分是block,block是用来存储数据的,而inode是用来存储这些数据信息的,包括文件大小、属主、归属的用户组、读写权限等。
使用ls –i 可以查看inode信息。
Inode值相同的文件,对应的数据是同一份,可以把他们看成是互为硬链接的关系。当我们修改其中一个文件的内容时,互为硬链接的文件内容也会跟着变化。如果我们删除互为硬链接关系的某个文件时,另外的硬链接文件并不受影响,即文件数据还在。
对比源文件和软链接文件:
(1) 两个文件的inode节点值不同 (2) 两个文件的文件类型不同,源文件是f(普通文件),而软链接文件是l(链接文件) (3) 两个文件的读写权限不同,源文件是rw-r—r--,而软链接文件的读写权限是rwxrwxrwx (4) 两个文件的硬链接个数相同。都是1 (5) 两个文件的属主和所归属的用户组相同 (6) 两个文件的创建或者修改时间不同 |
特别提示:当我们修改链接文件的内容时,就意味着我们修改源文件的内容时,此时源文件的属性也会发生改变,但软链接文件的属性不会改变。
1.3权限位
1.3.1 权限位说明
Linux普通文件的读、写、执行权限说明
读:表示具有读取阅读文件内容的权限
写:表示具有新增、修改文件内容的权限(特别提示:删除或修改文件受父目录的权限控制)
执行:表示具有执行文件的权限
Linux目录的读、写、执行权限说明
读:浏览目录的权限
写:修改目录内文件的权限
执行:进入目录的权限
特别注意:当删除或移动一个文件或目录,仅与该文件和目录所在的上一层目录权限有关,与该文件本身属性无任何关系,对于文件来说,写文件是修改文件,而不是删除文件,因此写文件是与该文件的本身属性有关系的。
2.3.2改变权限属性的命令chmod
Chmod是用来改变文件或目录权限的命令,但只有文件的属主和超级用户root才有这种权限。通过chmod来改变文件或目录的权限有两种方法:一种是通过权限字母和操作字符来设置权限:另一种方法是使用数字来设置权限
(1) chmod数字设置权限法
chmod [数字组合] 文件名
chmod的数字方法说明:
r 4
w 2
x 1
- 0
示例:
[root@test2 ~]# ll test.txt -rw-r--r-- 1 root root 14 05-23 00:07 test.txt [root@test2 ~]# chmod 755 test.txt [root@test2 ~]# ll test.txt -rwx[q4] r-xr-x 1 root root 14 05-23 00:07 test.txt [root@test2 ~]# ll test.txt -rwxr-x[q5] r-x 1 root root 14 05-23 00:07 test.txt [root@test2 ~]# ll test.txt -rwxr-xr-x[q6] 1 root root 14 05-23 00:07 test.txt |
如果我们想改变的仅仅是要打开的目录的权限,那么我们不加任何参数;如果想把目录下所有的文件或子目录也同时改变,需要使用参数-R。
(2)chmod字母设置权限法
chmod [用户类型] [+|-|=] [授权字符] 文件名
用户或用户组定义:
u:代表属主
g:代表属组
o:代表其它用户
a:代表属主、属组和其他用户,也就是上面的三个用户的所有
权限定义字母:
r:代表读权限
w:代表写权限
x:代表执行权限
权限增减字符:
+:添加某个权限
-:取消某个权限
=:赋予给定权限并取消其他权限
示例:
[root@test2 ~]# ll test.txt -rwxr-xr-x 1 root root 14 05-23 00:07 test.txt [root@test2 ~]# chmod g+w test.txt #-------à用户组添加写的权限 [root@test2 ~]# ll test.txt -rwxrwxr-x 1 root root 14 05-23 00:07 test.txt [root@test2 ~]# chmod u=rx,g=wx,o=x test.txt #---à直接赋予用户读和执行的权限,用户组具有写和执行权限,其他用户只有执行权限 [root@test2 ~]# ll test.txt -r-x-wx--x 1 root root 14 05-23 00:07 test.txt [root@test2 ~]# chmod a-x test.txt #------------à三个权限组都减去执行的权限 [root@test2 ~]# ll test.txt -r---w---- 1 root root 14 05-23 00:07 test.txt |
1.3.3默认权限分配的命令
umask是通过八进制的数值来定义用户创建或目录的默认权限。umask表示的是禁止权限,文件盒目录略有不同。
重要总结:
对于文件来说,umask的设置是在假定文件拥有八进制权限666权限上进行,文件的权限666减去umask的掩码数值
对于目录来说,umask的设置是在假定文件拥有八进制777权限上进行,目录八进制权限777减去umask的掩码数值
示例:
[root@test2 test]# ll #----------à当前的目录为空 总计 0 [root@test2 ~]# umask #--------à查看当前uamsk值 0022 [root@test2 test]# touch qinbf.txt #---------à创建新文件 [root@test2 test]# ll 总计 4 -rw-r--r-- 1 root root 0 05-27 20:58 qinbf.txt #------à当前文件的权限为644,此为文件默认权限666减去022(umask值)所得 [root@test2 test]# umask 044 #---------à修改umask值为044 [root@test2 test]# touch qinbf2.txt #---------à创建新文件 [root@test2 test]# ll 总计 8 -rw--w--w- 1 root root 0 05-27 20:59 qinbf2.txt #--------à新文件的权限为422,此为文件的默认权限666减去umask值044所得 -rw-r--r-- 1 root root 0 05-27 20:58 qinbf.txt [root@test2 test]# umask 555 #---------à修改umask值为555 [root@test2 test]# touch qinbf3.txt #---------à创建新文件 [root@test2 test]# ll 总计 12 -rw--w--w- 1 root root 0 05-27 20:59 qinbf2.txt --w--w--w- 1 root root 0 05-27 20:59 qinbf3.txt #----------à请问老师,这里的文件权限为什么不是111(即--x—x--x)? 权限的加减不能完全等于数字的加减,umask值为555,意味着是r+x的组合,所以文件最终得到的权限为默认的权限减去读(r)和执行(x)的权限,所以剩下写(w)的权限。可以理解为文件默认已经减去了执行的权限,最终默认权限为777-111=666。所以当umask的值为单数值时,就要注意了。 -rw-r--r-- 1 root root 0 05-27 20:58 qinbf.txt [root@test2 test]# umask 666 #---------à修改umask值为666 [root@test2 test]# touch qinbf4.txt #---------à创建新文件 [root@test2 test]# ll 总计 16 -rw--w--w- 1 root root 0 05-27 20:59 qinbf2.txt --w--w--w- 1 root root 0 05-27 20:59 qinbf3.txt ---------- 1 root root 0 05-27 21:00 qinbf4.txt #----------à新建的文件权限为空 -rw-r--r-- 1 root root 0 05-27 20:58 qinbf.txt |
umask一般都是放在用户的相关shell的配置文件中,比如用户家目录下的.bashrc或.profile,也可以放在全局性用户配置文件中,比如/etc/login.defs[q7] ,还可以放在SHELL全局的配置文件中,比如/etc/profile或/etc/bashrc等;
2.文件和目录的实践
注意1:以上操作在root和qinbf用户之间切换了身份,需注意每一步执行的身份。
=============================================================================== 在根目录下以两个用户名命名的目录,并保持目录归属和用户名一致 =============================================================================== [root@test2 ~]# mkdir /qinbf [root@test2 ~]# mkdir /test [root@test2 ~]# ll -d /qinbf/ /test/ drwxr-xr-x 2 root root 4096 05-28 15:23 /qinbf/ drwxr-xr-x 2 root root 4096 05-28 15:23 /test/ [root@test2 ~]# chown -R qinbf.qinbf /qinbf [root@test2 ~]# chown -R test.test /test [root@test2 ~]# ll -d /qinbf/ /test/ drwxr-xr-x 2 qinbf qinbf 4096 05-28 15:23 /qinbf/ drwxr-xr-x 2 test test 4096 05-28 15:23 /test/ =============================================================================== 以root身份在两个新建目录下分别创建同名的文件,尝试以qinbf身份删除test用户的文件 =============================================================================== [root@test2 ~]# touch /qinbf/qinbf-test [root@test2 ~]# touch /test/qinbf-test [root@test2 ~]# ll /qinbf/qinbf-test /test/qinbf-test -rw-r--r-- 1 root root 0 05-28 15:24 /qinbf/qinbf-test -rw-r--r--[q8] 1 root root 0 05-28 15:24 /test/qinbf-test [qinbf@test2 test]$ whoami qinbf [qinbf@test2 ~]$ ll -d /test/ drwxr-xr-x[q9] 2 test test 4096 05-28 15:24 /test/ [qinbf@test2 ~]$ cd /test/ [qinbf@test2 test]$ rm -f qinbf-test rm: 无法删除 “qinbf-test”: 权限不够 [qinbf@test2 test]$ ll 总计 4 -rw-r--r-- 1 root root 0 05-28 15:24 qinbf-test #--------------à权限不够,无法删除,还存在 =============================================================================== 将/test/qinbf-test给与qinbf用户写和执行的权限,qinbf用户再次尝试删除 =============================================================================== [root@test2 ~]# chmod o+wx /test/qinbf-test [qinbf@test2 test]$ ll 总计 4 -rw-r--rwx 1 root root 0 05-28 15:24 qinbf-test [qinbf@test2 test]$ rm -f qinbf-test rm: 无法删除 “qinbf-test”: 权限不够 #------------à删除再次失败 =============================================================================== 调整策略,还原/test/qinbf-test为创建初的权限(只读),/test目录给与qinbf用户写的权限 =============================================================================== [root@test2 ~]# chmod 644 /test/qinbf-test [root@test2 ~]# ll /test/qinbf-test -rw-r--r-- 1 root root 0 05-28 15:24 /test/qinbf-test [root@test2 ~]# chmod o+w /test/ [root@test2 ~]# ll -d /test/ drwxr-xrwx 2 test test 4096 05-28 15:24 /test/ [qinbf@test2 test]$ rm -f /test/qinbf-test [qinbf@test2 test]$ ll 总计 0 #--------------------à删除qinbf-test文件成功 =============================================================================== 再次创建/test/qinbf-test文件,并取消所有权限,验证文件的写入权限,qinbf用户再次删除 =============================================================================== [root@test2 ~]# ll /test/ 总计 0 [root@test2 ~]# touch /test/qinbf-test [root@test2 ~]# ll /test/qinbf-test -rw-r--r-- 1 root root 0 05-28 15:34 /test/qinbf-test [root@test2 ~]# chmod 000 /test/qinbf-test [root@test2 ~]# ll /test/ 总计 4 ---------- 1 root root 0 05-28 15:34 qinbf-test [qinbf@test2 test]$ ll qinbf-test ---------- 1 root root 0 05-28 15:34 qinbf-test [qinbf@test2 test]$ echo "hello" >> qinbf-test -bash: qinbf-test: 权限不够 #-------------à由于没有w(写权限),无法写入文件内容 [qinbf@test2 test]$ rm -f qinbf-test [qinbf@test2 test]$ ll #-------------à但是可以删除该文件 总计 0 =============================================================================== 再次创建/test/qinbf-test文件,验证文件的r、w权限以及移除文件需要目录的w权限 =============================================================================== [root@test2 ~]# touch /test/qinbf-test [root@test2 ~]# ll /test/ 总计 4 -rw-r--r-- 1 root root 0 05-28 15:36 qinbf-test [root@test2 ~]# echo "hello">>/test/qinbf-test [root@test2 ~]# ll /test/ 总计 4 -rw-r--r-- 1 root root 0 05-28 15:38 qinbf-test [qinbf@test2 test]$ cat qinbf-test hello # ----------à最后三位r--表明qinbf用户可以查看该文件内容 [qinbf@test2 test]$ echo "qinbf">>qinbf-test -bash: qinbf-test: 权限不够 #--------à但是不能修改该文件 [qinbf@test2 test]$ ll -d /test/ drwxr-xrwx 2 test test 4096 05-28 15:36 /test/ [qinbf@test2 test]$ mv qinbf-test /tmp/ [qinbf@test2 test]$ ll 总计 0 #-----------------à移除成功 =============================================================================== 验证目录的r(读)、x(进入)权限 =============================================================================== [root@test2 ~]# chmod o-r /test/ #--------------à以root身份减去了,其他用户的r(读)权限 [qinbf@test2 test]$ ll ls: .: 权限不够 #---------àqinbf用户已经无法阅览/test目录了,验证了r(读)权限的意义 [qinbf@test2 test]$ cd .. #--------à先退出/test目录 [root@test2 ~]# chmod o-x /test/ #----------à减去其他用户的x权限 [root@test2 ~]# ll -d /test/ drwxr-x-w- 2 test test 4096 05-28 15:38 /test/ #------------à-w-表明只有写的权限 [qinbf@test2 /]$ cd /test/ #---------------à此时已经无法进入目录,验证了x(进入)的权限 -bash: cd: /test/: 权限不够 |
注意2:严格来说演示的时候,/test/qinbf-test的归属应该都是test,test,而不是root,使用chmod修改权限的时候,最好以test用户的身份来修改,而不是root。
3.文件和目录特殊权限位介绍
3.1 setuid和setgid介绍
setuid和setgid位是让普通用户可以以root用户的角色运行只有root账号才能运行的程序或命令。(注意su和sudo的区别)
普通用户修改自己的密码,实际上是修改/etc/passwd这个文件的内容。而普通用户修改/etc/passwd几乎是不可能的事,那么为什么普通用户可以通过passwd命令来修改密码呢。
因为/usr/bin/passwd文件已经设置了setuid位,所以普通用户在执行/usr/bin/passwd命令时能够使用root用户的权限,间接的修改/etc/passwd,以达到修改自己口令的权限。
[root@test2 ~]# ll /usr/bin/passwd -rwsr-xr-x 1 root root 27936 2010-08-11 /usr/bin/passwd |
为了完成只有root用户才能完成的工作,我们必须为普通用户提升权限,最常用的方法济源市su或sudo。虽然setuid和setgid也是让普通用户超越自身拥有的权限达到使用root权限的方法,但不推荐大家使用,因为它能为系统带来安全隐患。
3.2字符修改特殊权限的方法:
[root@test2 test]# chmod u+s test [root@test2 test]# ll 总计 4 --wS-w--w- 1 root root 0 05-27 21:08 test [root@test2 test]# chmod u+x test [root@test2 test]# ll 总计 4 --ws-w--w- 1 root root 0 05-27 21:08 test [root@test2 test]# chmod g+s test [root@test2 test]# ll 总计 4 --ws-wS-w- 1 root root 0 05-27 21:08 test [root@test2 test]# chmod g+x test [root@test2 test]# ll 总计 4 --ws-ws-w- 1 root root 0 05-27 21:08 test [root@test2 test]# chmod o+t test [root@test2 test]# ll 总计 4 --ws-ws-wT 1 root root 0 05-27 21:08 test [root@test2 test]# chmod o+x test [root@test2 test]# ll 总计 4 --ws-ws-wt 1 root root 0 05-27 21:08 test |
注意:如果对应的权限位上没有执行权限x,那么对应的特殊权限就是大写字母,添加执行权限x之后,就是小写字母。
3.3数值修改权限位的方法:
[root@test2 test]# chmod 000 test [root@test2 test]# ll 总计 4 ---------- 1 root root 0 05-27 21:08 test [root@test2 test]# chmod 4000 test [root@test2 test]# ll 总计 4 ---S------ 1 root root 0 05-27 21:08 test [root@test2 test]# chmod 2000 test [root@test2 test]# ll 总计 4 ------S--- 1 root root 0 05-27 21:08 test [root@test2 test]# chmod 1000 test [root@test2 test]# ll 总计 4 ---------T 1 root root 0 05-27 21:08 test [root@test2 test]# chmod 4100 test [root@test2 test]# ll 总计 4 ---s------ 1 root root 0 05-27 21:08 test [root@test2 test]# chmod 2010 test [root@test2 test]# ll 总计 4 ------s--- 1 root root 0 05-27 21:08 test [root@test2 test]# chmod 1001 test [root@test2 test]# ll 总计 4 ---------t 1 root root 0 05-27 21:08 test |
注意:如果对应的权限位上没有执行权限x,那么对应的特殊权限就是大写字母,添加执行权限x之后,就是小写字母。
[q1]这串字符变为红底闪烁字符。
[q2]已经恢复正常色,不再是红底闪烁字符
[q3]之前被删除的qinbf文件inode号是1409027。名字虽然相同,但是inode号不同,且不同于qinbf_hard_link文件的inode号。
[q4]user位,r(4)+w(2)+x(1)=7
[q5]group位,r(4)+-(0)+x(1)=5
[q6]other位,r(4)+-(0)+x(1)=5)
[q7]用户的UID、GID的最大最小值以及密码过期期限等设置也是在/etc/login.defs文件中。
[q8]/test/qinbf-test文件对于qinbf用户来说,只有r(读)的权限
[q9]/test/目录对于qinbf用户来说,有r(阅读)和x(进入)的权限