侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 748 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

Linux基础(19)之文件权限管理

zze
zze
2019-10-22 / 0 评论 / 0 点赞 / 657 阅读 / 9800 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

文件权限的介绍

文件的权限主要针对三类对象定义:

  1. owner:属主,简写 u
  2. group:属组,简写 g
  3. other:其它,简写 o

通过 ls -l 可以查看到文件的详细信息,以下面的 text.txt 文件为例:

-rw-r--r--.             1           root     root    0 9月  10 15:43     test.txt
文件类型及权限  硬链接次数     属主     属组        创建时间           文件名

-rw-r--r-- 描述了 test.txt 文件的类型和权限信息,它的长度是 10。
第 1 位描述的是文件类型,它可以有其它几个取值,如下:

  • -(f):普通文件
  • d:目录文件
  • b:块设备
  • c:字符设备
  • l:符号链接文件
  • p:管道文
  • s:套接字文件(socket)

test.txt 文件是一个普通文件。
方便后续描述,将后面 9 位分为 3 组,第 2-4 位为第 1 组,第 5-7 位为第 2 组,第 8-10 位则位第 3 组。
第 1 组为该文件属主的权限,第 2 组为该文件属组的权限,第 3 组为其它用户对该文件的权限。
每一组分别有 3 位,每一位可以有 3 个取值,详细如下:

  • r:Readable,可使用文件查看类工具获取其内容。
  • w:Writable,可修改其内容。
  • x:eXcutable,可以将此文件提请内核启动为一个进程。

例:查看 ls 命令对应的文件权限。

[root@localhost ~]# ls -l /bin/ls
-rwxr-xr-x. 1 root root 117680 10月 31 2018 /bin/ls

可以看到,文件的属主 root 对改文件拥有读写和执行的权限,而该文件属组 root 和其它用户都只有它的读和执行权限。
上述描述是针对的文件,而目录也是有它相应的权限,例:

[root@localhost ~]# ls -ld /tmp/testDir/
drwxr-xr-x. 2 root root 6 9月  11 16:41 /tmp/testDir/

目录的权限描述信息格式与文件相同,但是每一位所表达的权限含义有所不同,如下:

  • r:可以使用 ls 命令查看该目录中的文件列表,无法 cd 进此目录。
  • w:可以在此目录中创建文件,也可以删除此目录中的文件。
  • x:可以使用 ls -l 命令查看此目录中的文件列表,并且可以 cd 进此目录。

如果某用户对一个目录拥有 rw 权限,但是对改目录中的某文件没有 rw 权限,那么该用户虽然不能修改该文件的内容,但可以删除该文件。

为了避免文件被恶意利用,所以任何用户创建的文件默认都没有执行权限,例:

[root@localhost ~]# touch testfile.txt
[root@localhost ~]# ll
-rw-r--r--. 1 root root    0 9月  10 15:43 test.txt

而目录则没有这个限制,所以新创建的目录默认都是有执行权限,例:

[root@localhost ~]# ls -ld testDir/
drwxr-xr-x. 2 root root 6 9月  11 16:51 testDir/

用八进制数表示权限

由于每一组权限一共只有 3 位,而每一位又只有 3 个取值,所以每一组权限只有如下 8 种变化,这八种变化又可以对应在 3 位二进制上(有权限的位为 1),而每一个 3 位二进制数又可以对应一个八进制数,如下:

  • ---:无权限,对应二进制为 000,对应八进制为 0
  • --x:可执行,对应二进制为 001,对应八进制为 1
  • -w-:只写,对应二进制为 010,对应八进制为 2
  • -wx:可写可执行,对应二进制为 011,对应八进制为 3
  • r--:只读,对应二进制为 100,对应八进制为 4
  • r-x:可读可执行,对应二进制为 101,对应八进制为 5
  • rw-:可读可写,对应二进制为 110,对应八进制为 6
  • rwx:可读可写可执行,对应二进制为 111,对应八进制为 7

所以任何一组权限都可以使用一个八进制数字表示。
例:

  1. 如果有一个文件的权限对应八进制数为 640,则表示这个文件的权限为 rw-r-----
  2. 如果有一个文件的权限描述为 rwxr-xr-x,则这个文件的权限对应八进制数为 755

所以八进制数也是文件权限的另外一种表示方式。

文件权限的修改

修改文件权限可使用 chmod 命令,使用格式如下:

使用八进制数字修改

格式:

chmod [OPTION]... OCTAL-MODE FILE...

现有如下 testfile.txt 文件:

[root@localhost ~]# ll
-rw-r--r--. 1 root root    0 9月  11 16:50 testfile.txt

如果要修改该文件的权限为 rw-r------,因该权限对应的八进制数为 640,所以可以通过命令修改:

[root@localhost ~]# chmod 640 testfile.txt 
[root@localhost ~]# ll
-rw-r-----. 1 root root    0 9月  11 16:50 testfile.txt

修改目录的权限

如果要修改目录的权限,同样可以使用上面的八进制数字方式修改。
看如下示例,现有如下 testDir 目录:

[root@localhost ~]# ll
drwxr-xr-x. 2 root root    6 9月  11 16:51 testDir

现要修改其权限为 rwxr-x---,对应八进制数为 750,执行命令如下:

[root@localhost ~]# chmod 750 testDir/
[root@localhost ~]# ll -d testDir/
drwxr-x---. 2 root root 6 9月  11 16:51 testDir/

使用 chmod 命令对目录权限修改不会影响该目录中的文件,如果希望修改目录权限的时候让其下文件一并修改为相应权限,则可使用 -R 选项表示递归修改。

针对某类用户修改权限

格式:

chmod [OPTION]... MODE[,MODE]... FILE...

chmod 命令也能够直接针对某类用户修改权限,修改权限时可通过如下字符来指定时修改哪一类的权限:

  • u:属主;
  • g:属组;
  • o:其它用户;
  • a:所有用户;

例:修改 testfile.txt 文件为仅属主读写。

[root@localhost ~]# chmod u=rw,g=,o= testfile.txt 
[root@localhost ~]# ll
-rw-------. 1 root root    0 9月  11 16:50 testfile.txt

多类用户权限不同时可按如上通过 , 隔开指定权限。
多类用户权限相同时可组合字符使用,上述示例还可修改为如下:

chmod u=rw,go= testfile.txt

上述修改的方式其实时直接覆盖修改某类用户的权限,还可通过 +- 来基于原有权限进行修改。
例 1:给 testfile.txt 的属主添加执行权限。

[root@localhost ~]# chmod u+x testfile.txt 
[root@localhost ~]# ll
-rwx------. 1 root root    0 9月  11 16:50 testfile.txt

例 2:去除 testfile.txt 属主的写权限啊。

[root@localhost ~]# chmod u-w testfile.txt 
[root@localhost ~]# ll
-r-x------. 1 root root    0 9月  11 16:50 testfile.txt

该操作同样支持 -R 选项来同时修改目录下的所有文件权限,同时操作多类用户权限也可以通过 , 分隔。

引用权限修改

格式:

chmod [OPTION]... --reference=RFILE FILE..

引用权限修改指的是可以参考另一个文件的权限来修改指定文件的权限与之相同。
例:修改 b.txt 的权限让之与 a.txt 的权限相同。

[root@localhost test]# chmod b.txt --reference=a.txt 
[root@localhost test]# ll
-rwx------. 1 root root 0 9月  11 22:03 a.txt
-rwx------. 1 root root 0 9月  11 22:04 b.txt

修改文件的属主和属组

下述命令只有管理员用户可以执行。

chown

chown 命令用来修改文件的属主和属组,有两种方式,可以手动中指明属主和属组,也可以引用修改。
例 1:修改 a.txt 文件的属主为 tom 用户。

[root@localhost test]# chown tom a.txt 
[root@localhost test]# ll
总用量 0
-rwx------. 1 tom  root 0 9月  11 22:03 a.txt

chown 命令也可以同时修改文件的属主和属组,需要用 : 分隔开,属主在前,属组在后。
例 2:修改 a.txt 文件的属主为 jerry,属组为 tom

[root@localhost test]# ll
-rwx------. 1 jerry tom   0 9月  11 22:03 a.txt

如果 : 前不指定属主,则表示只修改属组。
例 3:修改 b.txt 文件的属组为 jerry

[root@localhost test]# chown :jerry b.txt 
[root@localhost test]# ll
-rwx------. 1 root jerry 0 9月  11 22:04 b.txt

命令中的 : 可以用 . 来替换。
使用 chown 修改属主和属组同样可以通过 -R 选项来递归修改目录及目录下的文件的属主和属组。

chown 命令也有着和 chmod 相似的引用修改的用法,同样是通过 --reference 选项来指定引用的文件来将目标文件的属主和属组修改为和引用文件相同。
例:修改 a.txt 文件的属主和属组和 b.txt 文件相同。

[root@localhost test]# ll
-rwx------. 1 jerry tom   0 9月  11 22:03 a.txt
-rwx------. 1 root  jerry 0 9月  11 22:04 b.txt
[root@localhost test]# chown a.txt --reference b.txt 
[root@localhost test]# ll
-rwx------. 1 root jerry 0 9月  11 22:03 a.txt
-rwx------. 1 root jerry 0 9月  11 22:04 b.txt

chgrp

chgrp 命令主要就是用来修改文件的属组,该功能也可以使用 chown 实现,所以太常用。
例:修改 b.txt 文件的属组为 tom 组。

[root@localhost test]# chgrp tom b.txt 
[root@localhost test]# ll
总用量 0
-rwx------. 1 root jerry 0 9月  11 22:03 a.txt
-rwx------. 1 root tom   0 9月  11 22:04 b.txt

该命令也能使用引用修改,依旧是通过 --reference 选项来实现。
例:修改 a.txt 文件的属组与 b.txt 文件的属组相同。

[root@localhost test]# chgrp a.txt --reference b.txt 
[root@localhost test]# ll
总用量 0
-rwx------. 1 root tom 0 9月  11 22:03 a.txt
-rwx------. 1 root tom 0 9月  11 22:04 b.txt

该命令同样支持使用 -R 选项来递归修改指定目录和目录下所有文件的属组。

文件及目录的遮罩码

文件及目录创建时都有一个默认的权限,如我们会发现默认创建的文件对应的权限八进制数为 644,而目录创建的默认权限对应的八进制码为 755
为啥会这样呢?这就是遮罩码的作用,遮罩码也称 umask 码,文件创建的默认权限为 666 - umask,而目录创建的默认权限为 777 - umask。文件和目录默认权限还有一点不同的是,如果文件的某类权限通过 666 - umask 计算出来的结果包含了执行权限,那么该权限对应的八进制数就要加 1
遮罩码即 umask 码其实可以通过 umask 命令来查看和设置。
例:查看当前的 umask 码。

[root@localhost tmp]# umask
0022

普通用户的 umask 码默认为 2,相当于 002,所以普通用户默认创建的文件权限八进制数为 664

如果要手动设置 umask 码的值,直接在 umask 命令后跟上要设置的 umask 码即可。
例:修改 umask 码值为 3,创建文件查看文件权限。

[root@localhost tmp]# umask 3
[root@localhost tmp]# touch test.tmp
[root@localhost tmp]# ll
-rw-rw-r--. 1 root root   0 9月  11 22:50 test.tmp

可以看到该文件权限还是 664,这是因为本来计算出来的权限为 663,而 3 中包含了执行权限,所以该类权限加 1 就还是 664
再来创建一个目录试试。
例:修改 umask 码值为 4,创建目录查看目录权限。

[root@localhost tmp]# umask 4
[root@localhost tmp]# mkdir testDir
[root@localhost tmp]# ll
drwxrwx-wx. 2 root root   6 9月  11 22:53 testDir

可以看到,新创建的目录权限的确为 777 - umask 的结果即 773

要注意的是:umask 值的设定,只对当前用户的当前 shell 进程有效,要想永久有效,则需修改配置文件。

0

评论区