详解linux中的文件权限识别及修改
作者:岳来
一、文件权限认识
在 Linux 系统中,一切皆文件,目录也是一种文件形式叫目录文件,它们的属性主要包含: 索引节点(inode),类型、权限属性、链接数、所归属的用户和用户组、最近修改时间
等内容。如下为根目录下目录:
$ ls -lih total 60K 263121 lrwxrwxrwx 1 root root 7 Jun 2 2017 bin -> usr/bin 263122 dr-xr-xr-x 2 root root 4.0K Dec 7 2017 boot 1 drwxr-xr-x 5 root root 360 Aug 11 14:36 dev 1315847 drwxr-xr-x 1 root root 4.0K Aug 11 14:36 etc 263621 drwxr-xr-x 5 root root 4.0K Nov 29 2019 home 264862 lrwxrwxrwx 1 root root 7 Jun 2 2017 lib -> usr/lib 264863 lrwxrwxrwx 1 root root 9 Jun 2 2017 lib64 -> usr/lib64 264864 drwx------ 2 root root 4.0K Jun 2 2017 lost+found 264865 drwxr-xr-x 2 root root 4.0K Dec 13 2015 media 264866 drwxr-xr-x 2 root root 4.0K Dec 13 2015 mnt 264867 drwxr-xr-x 3 root root 4.0K Nov 29 2019 opt 1 dr-xr-xr-x 373 root root 0 Aug 11 14:36 proc 4851238 dr-xr-x--- 1 root root 4.0K Dec 11 2019 root 4851241 drwxr-xr-x 1 root root 4.0K Feb 14 11:17 run 264881 lrwxrwxrwx 1 root root 8 Jun 2 2017 sbin -> usr/sbin 264882 drwxr-xr-x 2 root root 4.0K Dec 13 2015 srv 1 dr-xr-xr-x 13 root root 0 Aug 11 14:36 sys 4851264 drwxrwxrwx 1 root root 4.0K Feb 14 11:17 tmp 4851265 drwxr-xr-x 1 root root 4.0K Nov 29 2019 usr 4852397 drwxr-xr-x 1 root root 4.0K Jun 4 2019 var
1.1、索引节点
在 Linux 文件系统中,每个文件都有一个用于标识和管理它的唯一索引节点号(inode number)。索引节点位于文件系统的元数据区域,包含了文件的所有元数据信息,例如文件的所有者、权限、大小、创建时间、修改时间、访问时间等。
索引节点号是一个唯一的数字,用于标识一个文件。在 Linux 文件系统中,每个文件和目录都有一个唯一的索引节点号,这个号码在文件系统中是唯一的。
使用如下命令查看文件目录索引节点:
$ ls -i total 12528 266890 locale-archive # 266890 即为文件locale-archive的索引节点
一个文件可以有多个硬链接(hard link),每个硬链接都有一个不同的文件名,但它们共享同一个索引节点号。因此,通过硬链接可以让多个文件名指向同一个物理文件。
硬链接和软链接
硬链接(Hard Link)是指多个文件名指向同一个物理文件的链接。多个硬链接共享同一个索引节点号(inode number),因此它们在文件系统中的位置相同,且没有任何区别。每个硬链接都是一个完整的文件名,都可以作为原始文件名使用,并且都可以对文件进行读写操作。
符号链接(Symbolic Link,也称软链接)是指一个特殊类型的文件,它包含了指向另一个文件的路径名。符号链接本身是一个文件,其中包含的路径名指向另一个文件。当访问符号链接时,实际上是访问链接所指向的文件。与硬链接不同,符号链接指向的是文件名,而不是物理文件。
硬链接和符号链接的主要区别如下:
- 硬链接只能链接同一文件系统中的文件,而符号链接可以跨越文件系统。
- 硬链接会共享同一个索引节点,因此它们必须指向同一个物理文件,而符号链接可以指向任意文件或目录。
- 删除原始文件对硬链接没有任何影响,因为它们共享同一个索引节点,而删除原始文件会导致符号链接失效。
示例如下:
# 新建文件file.txt, 写入“Hello World!” $ vim file.txt # 分别对file.txt 建立硬链接和软链接 $ ln file.txt hard_file.txt $ ln -s file.txt soft_file.txt # 与硬链接区别在于加 -s $ ll total 8 -rw-r--r-- 2 root root 13 Aug 11 16:35 file.txt -rw-r--r-- 2 root root 13 Aug 11 16:35 hard_file.txt lrwxrwxrwx 1 root root 8 Aug 11 16:36 soft_file.txt -> file.txt # 查看文件内容 $ cat file.txt Hello World! $ cat hard_file.txt Hello World! $ cat soft_file.txt # 有文章说符号链接无法查看内容,只是显示文件名,这里无法确认 Hello World! # 删除原始文件后查看文件内容 $ rm -rf file.txt $ cat hard_file.txt Hello World! $ cat soft_file cat: soft_file: No such file or directory
1.2、类型
1.2.1、普通文件:
-
代表普通文件,如下:
$ ll /etc/passwd -rw-r--r-- 1 root root 1690 Aug 14 04:46 /etc/passwd
1.2.2、目录文件
d
代表目录文件,如下:
$ ll /home/ drwx------ 3 admin admin 4096 Mar 21 10:32 admin
1.2.3、块设备文件
b
代表目录文件,如下:
brw-rw---- 1 root disk 253, 0 Nov 30 2022 vda brw-rw---- 1 root disk 253, 1 Nov 30 2022 vda1 brw-rw---- 1 root disk 253, 2 Nov 30 2022 vda2 brw-rw---- 1 root disk 253, 16 Nov 30 2022 vdb
在Linux系统中,块设备文件是一种特殊的文件类型,用于访问磁盘、光盘等块设备。块设备文件通常以 /dev/sdX
或 /dev/hdX
的形式存在,其中X表示驱动器的字母编号,从a开始递增。例如, /dev/sda
表示系统中的第一个硬盘, /dev/sdb
表示系统中的第二个硬盘,以此类推。
块设备文件是一种原始的设备文件,可以直接读写设备的扇区数据。在Linux系统中,块设备驱动程序会把块设备映射到文件系统中,从而使用户可以通过文件系统来管理磁盘。
块设备文件通常被用于分区、格式化、挂载、卸载硬盘等操作。例如,通过fdisk命令可以对块设备文件进行分区操作,使用mkfs命令可以对分区进行格式化,使用mount和umount命令可以将文件系统挂载到块设备上,并在不需要访问文件系统时将其卸载。
1.2.4、字符设备文件
c
代表字符设备文件,如下:
crw-rw-rw- 1 root tty 5, 0 Aug 4 14:25 tty crw--w---- 1 root tty 4, 0 Nov 30 2022 tty0 crw--w---- 1 root tty 4, 1 Nov 30 2022 tty1 crw--w---- 1 root tty 4, 10 Nov 30 2022 tty10
在Linux系统中,字符设备文件是一种特殊的文件类型,用于访问字符设备,例如键盘、鼠标、串口等。字符设备文件通常以 /dev/ttyX
或 /dev/ttySX
的形式存在,其中X表示设备的编号。
与块设备文件不同,字符设备文件以字符为单位进行读写,而不是以块为单位。因此,字符设备文件通常用于处理流数据,例如文本文件、串口数据等。字符设备文件具有缓存机制,可以提高文件读写速度,并且支持随机访问。
在Linux系统中,字符设备文件的操作方式与普通文件类似,可以使用open、read、write、ioctl等系统调用来访问设备。例如,使用cat命令可以读取键盘输入的字符,使用echo命令可以向串口发送数据。
1.2.5、符号链接文件
l
代表符号链接文件,如下:
lrwxrwxrwx. 1 root root 7 Nov 11 2020 python -> python2 lrwxrwxrwx. 1 root root 9 Nov 11 2020 python2 -> python2.7 lrwxrwxrwx 1 root root 16 Nov 11 2020 python2-config -> python2.7-config lrwxrwxrwx. 1 root root 9 Apr 12 2022 python3 -> python3.6
1.2.6、管道文件
p
代表管道文件,如下:
prw------- 1 root root 0 Nov 30 2022 dmeventd-client prw------- 1 root root 0 Nov 30 2022 dmeventd-server
管道文件是一种特殊的文件类型,用于进程之间的通信。管道文件又被称为命名管道文件(Named pipe),与普通文件不同的是,管道文件不能用于存储数据,而是用于流式传输数据。
管道文件可以通过mkfifo命令创建,并且可以使用rm命令删除。管道文件的创建和删除不会影响到已经存在的进程,但是如果所有进程都关闭了管道文件,那么管道文件也会被删除。
在Linux系统中,管道文件通常用于进程之间的数据传输,例如通过管道将一个进程的输出直接传递给另一个进程的输入,从而实现数据处理。例如,可以使用以下命令将一个进程的输出传递给另一个进程:
$ command1 | command2
这样,command1的输出将被传递给command2的输入,从而实现数据处理。
1.2.7、套接字文件
s
代表套接字文件,如下:
srwxr-xr-x 1 root root 0 Apr 12 16:43 dockershim.sock srw-rw---- 1 root docker 0 Jul 27 16:47 docker.sock
在Linux系统中,套接字文件是一种特殊的文件类型,用于进程之间的网络通信。套接字文件通常以文件路径的形式存在,例如 /var/run/docker.sock
。
套接字文件可以被多个进程共享,因此可以用于实现进程之间的通信和协调。在Linux系统中,套接字文件通常用于实现网络服务,例如Web服务器、数据库服务器等。
套接字文件的创建和使用需要借助 Socket API
,这是一组用于网络编程的系统调用。在Socket API中,可以使用 socket、bind、listen、accept
等函数来创建和操作套接字文件。
套接字文件还可以分为两种类型:流套接字(Stream socket)和数据报套接字(Datagram socket)。流套接字是一种面向连接的套接字,用于可靠的传输数据。数据报套接字是一种无连接的套接字,用于快速传输小型数据包。
总之,套接字文件是Linux系统中非常重要的文件类型,用于进程之间的网络通信和协调。了解套接字文件的工作原理和使用方法,对于系统管理员和开发人员来说都是非常重要的。
1.3、权限
文件权限以 3 位为一组,分成 3 组,分别表示文件所有者的权限,文件所有者所属组的权限及其他用户的权限。
权限与数字对应关系表:
数字 | 符号 | 权限 |
---|---|---|
0 | — | 没有权限 |
1 | –x | 执行 |
2 | -w- | 写入 |
3 | -wx | 写入和执行 |
4 | r– | 读取 |
5 | r-x | 读取和执行 |
6 | rw- | 读取和写入 |
7 | rwx | 读取、写入和执行 |
1.4、链接数
链接数表示指向该文件的硬链接数量。当一个新的硬链接被创建时,文件的链接数会自动增加,当硬链接被删除时,链接数会相应减少。
例如,如果有一个名为 file.txt 的文件,并创建了两个硬链接 link1 和 link2,那么该文件的链接数就是 3(原始文件名 file.txt 和两个硬链接 link1 和 link2)。
链接数是 Linux 文件系统中一个重要的概念,它有以下几个作用:
1)确定文件是否可以被删除
链接数为 0 表示没有任何硬链接指向该文件,该文件可以被删除。
2)确定文件是否可以被修改
只有文件的所有硬链接都被删除之后,才能对文件进行修改。在硬链接存在的情况下,修改任何一个链接都会影响到其他链接。
3)确定文件是否可以被重命名
如果一个文件有多个硬链接,重命名其中一个硬链接会影响到其他硬链接。因此,只有当文件的所有硬链接都被删除后,才能将该文件重命名。
4)确定文件占用的磁盘空间
链接数的值等于文件的硬链接数加 1,其中加 1 表示文件本身所占用的空间。因此,当一个文件有多个硬链接时,它实际上只占用了一次磁盘空间。
如何查看文件链接数
ls -l
$ ls -l total 4 -rw-r--r-- 1 root root 5 Aug 14 14:11 test.txt # 其中链接数为 1
stat
命令
stat test.txt File: ‘test.txt' Size: 5 Blocks: 8 IO Block: 4096 regular file Device: 2000d8h/2097368d Inode: 1315730 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2023-08-14 14:11:57.865926283 +0800 Modify: 2023-08-14 14:11:57.865926283 +0800 Change: 2023-08-14 14:11:57.865926283 +0800 Birth: -
二、修改文件权限
2.1、 chmod 命令
2.1.1、数字方式
使用数字方式时,每个权限都由三个数字表示,分别代表所有者、所属组和其他用户的权限。结合1.3,使用命令 chmod 700 file.txt
,给文件file.txt 加权限为 rwx------
2.1.2、符号方式
可以使用 +
或 -
来添加或删除权限,通过 u
、 g
和 o
分别表示所有者、所属组和其他用户。
$ chmod u+rw file.txt # 此命令以为着给所有者增加读写权限,所属组合其他用户权限不变。
2.2、 chown 命令
chown 命令用于修改文件的所有者。它可以通过用户名或用户 ID 指定新的所有者。
$ chown admin test.py $ ll | grep test.py -rw-r--r-- 1 admin root 1997 Jun 27 16:59 test.py
2.3、 chgrp 命令
chgrp 命令用于修改文件的所属组。它可以通过组名或组 ID 指定新的所属组。
$ chgrp admin test.py $ ll | grep test.py -rw-r--r-- 1 admin admin 1997 Jun 27 16:59 test.py
2.4、 umask 命令
Linux 操作系统中,umask 命令用于设置新建文件或目录的默认权限。umask 命令是用户级别的命令,通过该命令可以设置当前用户的 umask 值,即默认权限掩码。
umask 值是三个八进制数的形式,如 022,每个数字分别表示文件权限掩码的三个位的值。其中,第一个数字表示新建文件的权限掩码的所有者部分,第二个数字表示所属组部分,第三个数字表示其他用户部分。
默认情况下,umask 值通常为 022,即新建文件的默认权限为 -rw-r--r--
,新建目录的默认权限为 drwxr-xr-x
。
例如,当 umask 值为 002 时,新建文件的默认权限为 -rw-rw-r--
,新建目录的默认权限为 drwxrwxr-x
。
umask 值可以使用 umask 命令进行修改,该命令的语法如下:
$ umask [mode]
其中,mode 参数可以是一个八进制数或者一个符号模式。如果没有指定 mode 参数,则 umask 命令将会显示当前的 umask 值
$ umask 0022
和chmod类似,也可以使用符号模式设置默认权限,如果要将默认权限掩码设置为 -rwxr-xr-x
,那么可以使用以下命令:
$ umask u=rwx,g=rx,o=rx
上述命令中,u 表示所有者,g 表示所属组,o 表示其他用户,= 表示设置权限。因此,u=rwx 表示设置所有者的权限为可读可写可执行,g=rx 表示设置所属组的权限为可读可执行,o=rx 表示设置其他用户的权限为可读可执行。
需要注意的是,umask 值是在当前会话中设置的,它不会影响已经存在的文件或目录的权限,只会影响新建文件或目录的默认权限。
如果要永久修改 umask 值,可以将其添加到 shell 配置文件中,如 ~/.bashrc、~/.bash_profile 或 /etc/profile
等。
总之,umask 命令用于设置新建文件或目录的默认权限掩码。umask 值是三个八进制数的形式,可以使用八进制数或符号模式进行修改。默认情况下,umask 值通常为 022。
到此这篇关于详解linux中的文件权限识别及修改的文章就介绍到这了,更多相关linux文件权限内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!