超级强大的【文件权限和归属管理】

405 阅读12分钟

1 文件和目录的归属管理

1.1 查看文件和目录的归属

文件的归属(所有权):

  • 属主:拥有该文件或目录的用户账号。
  • 属组:拥有该文件或目录的组账号。

使用 ls -l 命令查看文件的属性:

[root@localhost test]# ls -l 1.txt
-rw-r--r--. 1 root root 13 2月  10 20:28 1.txt

文件的属性分为9列,每列含义如下:

  • 第一列:表示文件类型,-属于普通文件。

  • 第二列:表示文件的UGO权限。rw-r--r--每三个一组。

    rw- :属主的权限;

    r-- :属组的权限;

    r-- :其他人的权限。

  • 第三列:表示ACL表中是否设置了ACL权限。“.” 表示无ACL权限,“+”表示设置了ACL权限。

  • 第四列:表示硬链接数。

  • 第五列:表示文件的属主。

  • 第六列:表示文件的属组。

  • 第七列:表示文件的大小,有多少字节。

  • 第八列:表示最后一次修改时间。

  • 第九列:表示文件名。

微信图片_20220222192628.png

1.2 设置文件和目录的归属chown、chgrp

chown命令格式:

chown 属主 文件或目录         //修改属主
chown :属组 文件或目录        //修改属组
chown 属主:属组  文件或目录    //修改属主和属组
chgrp 属组 文件或目录       //修改属组

常用选项:

-R:递归修改指定目录下所有文件、子目录的归属

示例:

1)chown既可以修改属主,也可以修改属组

[root@localhost test]# ls -l 1.txt     //查看文件1.txt的归属,属主为root,属组为root组
-rw-r--r--. 1 root root 13 2月  10 20:28 1.txt
[root@localhost test]# chown jack:hr 1.txt    //将属主修改为jack,属组修改为hr
[root@localhost test]# ll 1.txt        //查看归属,修改成功
-rw-r--r--. 1 jack hr 13 2月  10 20:28 1.txt

2)chgrp 只能修改属组

[root@localhost test]# ls -dl data    //查看data目录的归属,属主和属组为都root组
drwxr-xr-x. 2 root root 34 2月  22 15:46 data
[root@localhost test]# ls -l data     //data目录下的文件,属主和属组都为root
总用量 0
-rw-r--r--. 1 root root 0 2月  22 15:46 f1.txt
-rw-r--r--. 1 root root 0 2月  22 15:46 f2.txt
[root@localhost test]# chgrp -R hr data   //将data目录的属组修改为hr,同时递归修改目录下的所有文件
[root@localhost test]# ls -dl data       //查看data目录的属组已变为hr
drwxr-xr-x. 2 root hr 34 2月  22 15:46 data
[root@localhost test]# ll data          //查看data目录下所有文件的属组也都变为hr
总用量 0
-rw-r--r--. 1 root hr 0 2月  22 15:46 f1.txt
-rw-r--r--. 1 root hr 0 2月  22 15:46 f2.txt
​

注:

因为chgrp 命令只能修改属组,而chown命令既可修改属主也可修改属组,故实际运用中一般使用chown命令。

2 文件和目录的权限管理

文件的访问权限:

权限类型对文件的影响对目录的影响
r (读取)可读取文件内容可列出目录内容
w (写入)可修改文件内容可在目录中新建、移动、删除文件或子目录
x (执行)可作为程序执行可切换目录

微信图片_20220222192857.png

文件的读、写、执行权限,既可以用字符r、w、x表示,也可以分别表示为八进制数字4、2、1 。

目录的权限需注意:

  • 当只有 r 权限时,不能进入该目录,也不能在目录内创建、删除、修改文件。只能通过 “ls 目录路径”查看目录内的文件名称,不能查看文件的属性信息。

  • 当只有 w 权限时,不能进入目录,不能列出目录内的文件,也不能在目录内创建、删除、修改文件。必须同时有 x 权限,才能创建、删除、修改目录内的文件。

  • 当只有x权限时,只能进入该目录,但不能列出目录内容,也不能创建文件。

  • x 权限是目录最基础的权限,没有x权限,其他权限也会受影响。

2.1 基本权限UGO

Linux权限授权,默认是授权给三种角色UGO: user(属主)、group(属组)、other(其他人)。

每个文件的权限基于UGO进行设置。

权限三位一组(rwx),同时授权给三种角色UGO。

权限对象UGO:

  • u 属主(user);
  • g 属组(group);
  • o 其他人(other)。
  • a 所有人 all(u+g+o)

2.2 设置文件和目录的权限 chmod

chmod命令格式:

字符形式:

chmod   对象(u/g/o/a)赋值符(+/-/=)权限类型(r/w/x)   文件/目录
​
“+”号代表增加权限,“-”号代表减少相应权限,“=”号代表覆盖对应的权限。

数字形式:

chmod  nnn  文件/目录

选项:

-R 递归修改知道目录下所有子项的权限

示例:

1)使用字符形式设置权限

[root@localhost ceshi]# chmod u+x file01      //为属主增加执行权限
[root@localhost ceshi]# ls -l file01
-rwxr--r--. 1 root root 87 1月  21 17:37 file01
[root@localhost ceshi]# chmod g=rw file01     //为属组覆盖读写权限
[root@localhost ceshi]# ls -l file01
-rwxrw-r--. 1 root root 87 1月  21 17:37 file01
[root@localhost ceshi]# chmod o-r file01     //去掉其他人的读取权限
[root@localhost ceshi]# ls -l file01
-rwxrw----. 1 root root 87 1月  21 17:37 file01
[root@localhost ceshi]# chmod a+r file01     //为所有人增加读写权限
[root@localhost ceshi]# ls -l file01
-rwxrw-rw-. 1 root root 87 1月  21 17:38 file01

2)使用数字形式设置权限

[root@localhost test]# ll 1.txt         //查看文权限,属主为读写,属组和其他人只有读权限
-rw-r--r--. 1 jack hr 13 2月  10 20:28 1.txt
[root@localhost test]# chmod 666 1.txt    //设置属主、属组、其他人的权限都为读和写
[root@localhost test]# ll 1.txt           //查看文件权限,所有人都拥有读写权限       
-rw-rw-rw-. 1 jack hr 13 2月  10 20:28 1.txt
[root@localhost test]# chmod 744 1.txt   //设置属主拥有读写执行权限,属组和其他人只拥有读权限
[root@localhost test]# ll 1.txt
-rwxr--r--. 1 jack hr 13 2月  10 20:28 1.txt

2.3 权限掩码umask

umask作用:

  • 控制新建的文件或者目录的权限。
  • 默认权限去除umask的权限为新建的文件

umask查看: umask

umask设置: umask 0022

创建新文件和目录时,落地权限计算:

  • 系统默认umask为0022(第一个0与特殊权限有关,目前只需要看后三位)。
  • 目录的落地权限=0777-0022=0755。目录必须要有执行权限,用户才能访问该目录。
  • 文件的落地权限=0666-0022=0644。系统出于安全考虑,创建文件时去掉了所有的执行权限,防止一些不安全的程序文件被错误执行。

示例:

1)将umask设置为0000,创建目录和文件,查看权限。

[root@localhost test]# umask          //查看umask,为0022
0022
[root@localhost test]# umask 0000     //将umask设置为0000
[root@localhost test]# umask          //查看umask,为0000
0000
[root@localhost test]# mkdir a1       //创建al目录
[root@localhost test]# ls -dl a1      //查看目录权限,所有人都拥有读写执行权限
drwxrwxrwx. 2 root root 6 2月  22 17:51 a1
[root@localhost test]# touch b1.txt   //创建b1文件
[root@localhost test]# ll b1.txt      //查看目录权限,所有人都只拥有读写权限
-rw-rw-rw-. 1 root root 0 2月  22 17:55 b1.txt

2)将umask设置为0011,创建目录和文件,查看权限。

[root@localhost test]# umask 0011    //将umask设置为0011
[root@localhost test]# umask         //查看umask,为0011
0011
[root@localhost test]# mkdir a2      //创建a2目录
[root@localhost test]# ls -dl a2    //查看目录权限,属主拥有读写执行权限,属组和其他人拥有读写权限 
drwxrw-rw-. 2 root root 6 2月  22 18:00 a2
[root@localhost test]# touch b2.txt    //创建b2文件
[root@localhost test]# ll b2.txt       //查看文件权限,所有人都只拥有读写权限
-rw-rw-rw-. 1 root root 0 2月  22 18:00 b2.txt

注意:

当umask为0011时,创建文件,文件的权限是0666(rw-rw-rw-),而不是0655。

这是因为当umask为0011时,表示减去属组和其他人的执行权限。而创建文件时初始最高权限是0666,UGO三者本身就没有执行权限,无需再减去,所以落地权限为0666。

3、文件的特殊权限SUID、SGID、sticky bit

3.1 SUID

SUID(Set owner User ID up on execution) 是针对文件所设置的一个特殊权限。只作用于二进制文件中。

功能:设置了suid权限的程序文件,在用户执行该程序时,用户的权限是该程序文件属主的权限。

设置SUID的文件要求有如下几点:

  • 1)SUID只对可执行的二进制文件起作用,shell脚本设置后不生效。
  • 2)如果设置了其suid后,其属主的可以执行权限x会变成s(小写),如果是大写S那么说文件的属主没有执行权限,设置的SUID无效。
  • 3)SUID对目录设置无意义。

3.1.1 SUID设置方法

  • 字母设置方式:chmod u+s file

    取消SUID:chmod u-s file

  • 数字设置方式:chmod 4755 在普通三位数字权限位之前,用4代表添加的SUID位

    取消SUID:chmod 0755

3.1.2 SUID的作用演示

下面以passwd命令为例,来了解SUID的作用:

[root@localhost ceshi]# ls -l /usr/bin/passwd     //查看passwd程序文件的权限
-rwsr-xr-x. 1 root root 27832 6月  10 2014 /usr/bin/passwd

发现属主的执行位显示为s,而非x。这里的s就是suid权限。

passwd命令的属主为root。在我们修改密码时,passwd命令将编辑一些配置文件, 如/etc/passwd, /etc/shadow,这些文件只有root账户拥有权限打开或浏览。 普通用户执行passwd命令时,将会遇到权限拒绝的错误或者一些其他的错误。所以passwd命令设置SUID将root用户权限授权给普通用户,使普通用户可以使用passwd命令修改自己的密码。

示例01:

当passwd程序设置了suid权限时,普通用户可以使用passwd命令修改自己的密码。

[root@localhost ceshi]# ls -l /usr/bin/passwd    //查看passwd程序权限,带有suid权限
-rwsr-xr-x. 1 root root 27832 6月  10 2014 /usr/bin/passwd
[root@localhost ceshi]# su alice          //切换为普通用户alice
[alice@localhost ceshi]$ passwd           //使用passwd命令修改密码
更改用户 alice 的密码 。
为 alice 更改 STRESS 密码。
(当前)UNIX 密码:
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。      #修改成功 

示例02:

去掉passwd程序的suid权限后,普通用户无法使用passwd命令修改密码。

[root@localhost ceshi]# chmod u-s /usr/bin/passwd     //去掉suid权限
[root@localhost ceshi]# ll /usr/bin/passwd            //查看权限,不带有suid权限   
-rwxr-xr-x. 1 root root 27832 6月  10 2014 /usr/bin/passwd
[root@localhost ceshi]# su alice         //切换为普通用户alice
[alice@localhost ceshi]$ passwd          //使用passwd命令修改密码
更改用户 alice 的密码 。
为 alice 更改 STRESS 密码。
(当前)UNIX 密码:
新的 密码:
重新输入新的 密码:
passwd: 鉴定令牌操作错误                 #操作失败

注意:

  • passwd程序文件中的SUID权限为系统默认设置,非人为设置。
  • 实际项目中,出于安全考虑,一般不会人为设置或修改SUID权限。

3.2 SGID

SGID属性和SUID一样,只是SUID作用于属主,而SGID作用于属组。

SGID的功能:

  • SGID作用于二进制程序时,执行此程序的用户将拥有此程序的属组权限;
  • 作用于目录时,此目录下所有用户新建文件的默认属组是这个目录的属组。

同样在设置SGID的文件后,其属组权限位上的可执行权限x会变成s,如果变成了S说明属组没有执行权限,设置SGID无效。

SGID设置方法:

  • 字母设置方式:chmod g+s file/directory

    取消SGID:chmod g-s file/directory

  • 数字设置方式:chmod 2755 在普通三位数字权限位之前,用2代表添加的SUID位

    取消SGID:chmod 0755

3.3 sticky bit

这个权限的主要作用是在一个公共目录,每个用户都可以创建文件,删除自己的文件,但是不能删除别人的文件。这个权限只能用于目录,当某个目录拥有其Sticky权限 ,则其目录下的文件和目录只有root和其拥有者删除,其他用户不能删除,也就是说用户只能删除其自己本身属主的文件,不能删除其他属主的文件。

如果一个目录设置了其sticky权限,则其目录其他用户组的执行权限x会变成t(小写),它和SUID、SGID一样如果对应位是位上的可执行x变成了大写T ,那么表示其目录其他用户位上没有可执行权限,当然设置的Sticky就无效。

sticky设置方法:

  • 字母设置方式:chmod o+t directory

    取消SGID:chmod o-t directory

  • 数字设置方式:chmod 1755 在普通三位数字权限位之前,用1代表添加的sticky位

    取消SGID:chmod 0755

查看公共目录/tmp 的权限,有特殊权限sticky位:

 [root@localhost ~]# ll -dl /tmp
 drwxrwxrwt. 20 root root 4096 3月   1 10:05 /tmp

微信图片_20220301102946.png

3.4 总结

  • 1)在给文件或目录设置特殊权限时,其文件对应位上必须拥有可执行权限,否则设置特殊权限无效。如果对应位上没有可执行权限,设置了特殊权限会在对应位上显示大写的字母,表示其特殊权限无效。
  • 2)SUID只能作用于可执行的二进制文件,对目录无效。SGID可作用于可执行二进制文件和目录。Sticky只能作用于目录,对文件无效。
  • 3)都是用chmod 进行授权。对于SUID和SGID都是+/-s,对于Sticky是+/-t;其中SUDI对应user位,SGID对应group位,Sticky对应other位。数字表示法,4表示SUID,2表示SGID,1表示Sticky。