目录
Linux 文件系统权限
权限 | 对文件的影响 | 对目录的影响 |
---|---|---|
r (读取) | 可以读取文件内容。 | 可以列出目录的内容。 |
w (写入) | 可以更改文件内容。 | 可以创建或删除目录中的文件。 |
x (执行) | 可以作为命令执行文件。 | 可以 cd 目录,但是需要读取权限才能列出内容。 |
[root@redhat opt]# ll
总用量 0
drwxr-x--x. 2 root root 20 8月 27 18:44 aaa
-rw-r--r--. 1 root root 0 8月 27 18:40 1.txt
长列表的第一个字符表示文件类型,- 表示常规文件,d 表示目录,l 表示软链接,b 和 c 表示硬件设备等。
后面的九个字符表示文件权限,分为三组,每组三个字符,分别对应用户权限,组权限和其他用户权限。rwx 对应读取、写入、执行三种权限,如果某个字符用 – 替代,说明该类别下没有这个权限。
链接数后第一个名称表示拥有该文件的用户,第二个名称表示拥有该文件的组。
管理文件系统权限
通过 chmod 命令可以从命令行更改权限。
使用符号更改权限,命令格式为 chmod WhoWhatwhich file | directory。其中 Who 用 u、g、o、a 表示,分别代表用户、组、其他和权限;What 用 +、-、= 表示,分别代表添加、删除和精确设置;Which 用 r、w、x 表示,分别代表读取、写入和执行。
# 为 1.txt 的组添加写入权限
[root@redhat opt]# chmod g+w 1.txt
使用数字更改权限,命令格式为 chmod ### file | directory,每个 # 代表一个数字,三个数字分别代表用户、组和其他的访问级别权限。将每个权限的数值加在一起,即对应该对象的权限。
其中 4 代表读取,2 代表写入,1 代表执行。例如 rwxr-x–x 的用户权限为 4 + 2 + 1 = 7,组权限为 4 + 0 + 1 = 5,其他权限为 0 + 0 + 1 = 1,最终的数值表示为 751。
[root@redhat opt]# chmod 644 1.txt
[root@redhat opt]# ll
总用量 0
-rw-r--r--. 1 root root 0 8月 27 18:50 1.txt
在 Linux 上,权限仅适用于设置它们的文件或目录,也就是说目录中的字目录和文件不会自动继承目录的权限。使用 chmod 命令的 -R 选项可以以递归方式对整个目录树中的文件设置权限。
[root@redhat opt]# chmod -R g+rx aaa
使用 chown 命令可以更改文件和目录的用户或组所有权。
# 更改用户所有权
[root@redhat opt]# chown user01 1.txt
# 更改组所有权
[root@redhat opt]# chown :group01 1.txt
# 同时修改用户和组所有权
[root@redhat opt]# chown user02:group02 1.txt
特殊权限
特殊权限 | 对文件的影响 | 对目录的影响 |
---|---|---|
u+s (setUID) | 以拥有文件的用户身份,而不是以运行文件的用户身份执行文件。 | 无影响。 |
g+s (setGID) | 以拥有文件的组身份执行文件。 | 在目录中创建的新文件,其组所有者与当前目录的组所有者匹配。 |
o+t (sticky) | 无影响。 | 对目录具有写入权限的用户,仅可以删除其拥有的文件,无法删除或编辑其他用户拥有的文件。 |
对可执行文件文件的 setUID 权限,表示运行文件时以文件所有者 UID,而不是当前用户 UID 执行程序。
通常情况下所有者执行权限的字符为 x,设置 setUID 权限后由小写的 s 取代。如果所有者不具有执行权限,则显示为大写的 S。
典型的文件是 passwd。如果普通用户执行该文件,则在执行过程中该文件可以获得 root 权限,从而可以更改用户的密码。相当于临时拥有文件所有者的身份。s 权限位是一个敏感的权限,容易造成系统的安全问题,请在设置时注意。
[user01@redhat ~]$ ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 33544 3月 15 2021 /usr/bin/passwd
对目录的 setGID 权限,表示在该目录中创建的新文件,将自动继承该目录的组所有权。通常用于组协助目录,将文件从默认的专有组更改为共享组。
通常情况下组所有者执行权限的字符为 x,设置 setGID 权限后由小写的 s 取代。如果组所有者不具有执行权限,则显示为大写的 S。
[root@redhat ~]# ll /opt/aaa
总用量 0
-rw-r--r--. 1 user01 group01 0 8月 27 21:35 a1.txt
[user01@redhat ~]# ll /opt/aaa
总用量 4
-rw-r--r--. 1 user01 group01 3 8月 27 21:40 a1.txt
对可执行文件文件的 setGID 权限,表示运行文件时以文件所有者 GID,而不是当前用户 GID 执行程序。效果与设置 setUID 权限类似。
[user01@redhat ~]$ ll /usr/bin/locate
-rwx--s--x. 1 root slocate 42248 4月 12 2021 /usr/bin/locate
对目录的 sticky 权限,表示文件的所有者才能删除该目录中的文件。
通常情况下其他执行权限的字符为 x,设置 sticky 权限后由小写的 t 取代。然后其他不具有执行权限,则显示为大写的 T。
[user01@redhat ~]$ ll -d /tmp
drwxrwxrwt. 8 root root 250 8月 27 21:52 /tmp
使用符号更改特殊权限,setUID 为 u+s,setGID 为 g+s,sticky 为 o+t。
[user01@redhat /]$ chmod g+s /opt/aaa
[user01@redhat /]$ ll -d /opt/aaa
drwxrwsr-x. 2 user01 group01 20 8月 27 21:40 /opt/aaa
使用数字更改特殊权限,则使用四位数字表示,setUID 为 4,setGID 为 2,sticky 为 1。
[user01@redhat /]$ chmod 2775 /opt/aaa
[user01@redhat /]$ ll -d /opt/aaa
drwxrwsr-x. 2 user01 group01 20 8月 27 21:40 /opt/aaa
默认文件权限
在创建新文件或目录时,系统会为其分配初始权限。其中有两个因素会影响初始权限,首先是判断要创建的是常规文件还是目录,其次是当前的 umask。
如果创建的是新目录,系统会为其分配 0777 (drwxrwxrwx) 权限;如果创建的是新文件,系统会为其分配 0666 (drw-rw-rw-) 权限。此外,shell 会话还会一个 umask,进一步限制初始设置的权限。
通过 umask 命令可以查看当前 umask 的值。
[root@redhat ~]# umask
0022
如果在 umask 中设置了一个为,则新文件中对应的权限将被清除。
例如新目录的默认权限为 0777 (drwxrwxrwx) 权限,umask 为 0022,清除权限后,新创建的目录权限为 0755(drwxr-xr-x)。
[root@redhat ~]# mkdir aaa
[root@redhat ~]# ll
总用量 4
drwxr-xr-x. 2 root root 6 8月 27 22:09 aaa
如果希望屏蔽掉其他的所有文件和目录权限,可以将 umask 的值设置为 007。
[root@redhat ~]# umask 007
[root@redhat ~]# mkdir bbb
[root@redhat ~]# ll
总用量 0
drwxrwx---. 2 root root 6 8月 27 22:26 bbb
用户的默认 umask 值由 shell 启动脚本设置,默认情况下,如果账户 UID 为 200 以上,并且用户名和主要组名相同,默认 umask 值为 002,否则为为 022。
通过 root 用户,添加名为 /etc/profile.d/local-umask.sh 的 shell 启动脚本,可以更改默认 umask 值。完成后需要注销 shell 并重新登陆,确保全局 umask 值更改生效。
总结
- 文件具有三个应用权限的类别。文件由用户、单个组和其他用户拥有。应用最具体的权限。用户权限覆盖组权限,组权限又覆盖其他权限。
- chmod 命令可从命令行更改文件权限,有符号和数字两种表示权限的方法。
- chown 命令可更改文件所有权,-R 选项可以递归更改目录树的所有权。
- 不带参数运行 umask 命令将显示 shell 的当前 umask 值。系统上的每个进程都有一个 umask。Bash 的默认 umask 在/ etc/profile和/etc/bashrc 文件中定义。
「RHCSA 红帽系统管理」4、文件权限控制
https://blog.kobin.cn/notes/2826.html