Linux课程笔记 文件和目录权限

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(进入)的权限

posted @ 2017-04-23 14:09  fengze  阅读(205)  评论(0编辑  收藏  举报