第6章 文件系统权限

第6章 文件系统权限

6.1 查找文件

6.1.1 whereis

作用:用于定位一个命令的二进制文件、源文件和手册文件。

语法:whereis [选项] name....

 选项:
    -b:只搜索二进制文件
    -m:只搜索手册文件
    -s:只搜索源文件
    -l:输出whereis使用的有效查找路径

使用:

1、whereis 来搜索二进制文件,源文件和手册文件的位置

 [root@localhost ~]# whereis ls
 ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz
 ​
 # 如果把这个命令拆开就会报错
 [root@localhost ~]# where is ls
 bash: where: command not found...
 ​
 [root@localhost ~]# whereis whereis
 whereis: /usr/bin/whereis /usr/share/man/man1/whereis.1.gz

2、whereis -b/m/s:只展示其中一项

# 只显示二进制文件路径
[root@localhost ~]# whereis -b ls
ls: /usr/bin/ls

# 只显示手册文件
[root@localhost ~]# whereis -m ls
ls: /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz

# 只显示源文件
[root@localhost ~]# whereis -s ls
ls:

# 多个选项组合使用
[root@localhost ~]# whereis -bm ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz

3、还可以使用 whereis -B/M/S 来限定查找目录,但它必须与 -f 选项一起使用,否则 whereis 会把这个命令当前目录下使用

[root@localhost ~]# whereis -S /usr/src ls
whereis: option -f is missing
[root@localhost ~]# whereis -S /usr/src ls -f
[root@localhost ~]# whereis -S /usr/src -f ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz


[root@localhost ~]# whereis -m -M /usr/share/man/man1 -f ls
ls: /usr/share/man/man1/ls.1.gz

4、使用 whereis -l 来输出有效的查找路径

[root@localhost ~]# whereis -l
bin: /usr/bin
bin: /usr/sbin
bin: /usr/lib
bin: /usr/lib64
bin: /etc
bin: /usr/games
bin: /usr/local/bin
bin: /usr/local/sbin
bin: /usr/local/etc
bin: /usr/local/lib
bin: /usr/local/games
bin: /usr/include
bin: /usr/local
bin: /usr/libexec
.....省略

6.1.2 which

作用:用于查找并显示给定命令/文件的绝对路径,它可能会根据 $PATH 这个变量的设置来进行查找。

语法:which [选项] [文件...]

选项:
	-a:查找全部内容,而不仅仅是第一个文件
	-n<文件名长度>:指定文件名长度,这个长度必须大于或等于所有文件中最长的文件名
	-p<文件名长度>:它的作用与 -n 相同,只是包括了文件路径
	-w:指定输出时栏位的宽度
	-V:显示版本信息

使用:

1、显示命令 find 的绝对路径

[root@localhost ~]# whereis -b find
find: /usr/bin/find
[root@localhost ~]# which find
/usr/bin/find

2、显示命令 rm 的别名

[root@localhost ~]# which rm
alias rm='rm -i'
	/usr/bin/rm
[root@localhost ~]# which ll
alias ll='ls -l --color=auto'
	/usr/bin/ls

3、普通用户和root用户查找路径不同(redhat-9.2中显示一样)

# 对于 root 用户来说,cd 命令执行的路径在 /usr/bin/cd
[root@localhost ~]# which cd
/usr/bin/cd

[redhat@localhost ~]$ which ip
/bin/cd

记住:这个命令的作用就是显示被查找文件/命令的绝对路径。

6.1.3 locate

作用:用于查找符合条件的文档,他会去保存文档的目录名的数据库内查找。

特点:

  • 由于它是基于数据库查询,所以它的查询速度很快,但是它不是实时查询的。

  • 它是模糊查询

  • 需要对文件的目录有 rx 权限

语法:locate [选项]....... 模式......

其中:模式是用于要搜索的文件名或才路径的匹配方式。它支持通配符。

选项
	-i:忽略大小写
	-c:只返回匹配到的文件数量而不返回匹配到文件路径
	-n:不输出文件路径,仅显示匹配的文件数量
	-r REGEXP:使用正则表达式来匹配文件
	-w:仅匹配完整的单词

使用:

1、使用 locate 命令搜索名为 myfile.txt 文件,并显示文件的路径

[redhat@localhost ~]$ locate myfile.txt
[redhat@localhost ~]$ ls
Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos
[redhat@localhost ~]$ touch myfile.txt
[redhat@localhost ~]$ ls
Desktop  Documents  Downloads  Music  myfile.txt  Pictures  Public  Templates  Videos
[redhat@localhost ~]$ cd Pictures/
[redhat@localhost Pictures]$ ls
[redhat@localhost Pictures]$ touch myfile.txt
[redhat@localhost Pictures]$ cd ..
[redhat@localhost ~]$ ls
Desktop  Documents  Downloads  Music  myfile.txt  Pictures  Public  Templates  Videos
[redhat@localhost ~]$ mkdir test
[redhat@localhost ~]$ ls
Desktop  Documents  Downloads  Music  myfile.txt  Pictures  Public  Templates  test  Videos
[redhat@localhost ~]$ cd test
[redhat@localhost test]$ touch myfile.txt
[redhat@localhost test]$ cd ..
[redhat@localhost ~]$ ls
Desktop  Documents  Downloads  Music  myfile.txt  Pictures  Public  Templates  test  Videos
[redhat@localhost ~]$ locate myfile.txt

2、使用 locate 命令搜索以 .conf 结尾的配置文件,并显示文件的路径。

[redhat@localhost ~]$ locate *.conf
/usr/share/wireplumber/main.conf
/usr/share/wireplumber/policy.conf
/usr/share/wireplumber/wireplumber.conf
/usr/share/xfsprogs/mkfs/rhel8.0.conf
.....省略

[redhat@localhost ~]$ locate "*.conf" | head -n 5
/etc/anthy-unicode.conf
/etc/appstream.conf
/etc/asound.conf
/etc/brltty.conf
/etc/chrony.conf

3、使用 locate 命令搜索包含关键字 example 的文件,并显示文件的路径。

[redhat@localhost ~]$ locate example | head -n 5
/etc/samba/smb.conf.example
/etc/udisks2/mount_options.conf.example
/etc/vmware-tools/tools.conf.example
/usr/share/cups/examples
/usr/share/cups/examples/color.drv

[redhat@localhost ~]$ locate -c example
378
[redhat@localhost ~]$ locate -c Example
16
[redhat@localhost ~]$ locate -ci Example
385

4、使用 locate 命令搜索包含关键字 example 的文件,并限制返回的结果数据为 3

[redhat@localhost ~]$ locate -l 3 example
/etc/samba/smb.conf.example
/etc/udisks2/mount_options.conf.example
/etc/vmware-tools/tools.conf.example

6.1.4 find *****

作用:通过条件匹配在指定的目录下查找对应文件或目录。匹配的条件可以是文件名称、类型、大小、权限属性、时间戳等。

特点:

  • 精确查找

  • 查找速度较慢

  • 实时查询

语法:find [path.....] [expression]。其中,[path...] 为需要查找文件所指定的路径。如果不指定,则默认只在当前目录及其子目录中查找。[expression] 它是匹配的条件或表达式,如果没有设置匹配条件,则默认查询指定目录及子目录下所有文件。

选项:

-name:根据文件basename匹配名称
-path:可以对文件的dirname+basename进行查找
-size:匹配文件的大小(+50KB为查找超过50KB的文件,而-50KB为查找小于50KB的文件)
-mtime [+|-]n:匹配修改内容的时间(-4指小于等于4天内的文件名;+4,大于等于5天前的文件名;4指前4~5那一天的文件)
-atime [+|-]n:匹配访问文件的时间
-ctime [+|-]n:匹配修改文件权限的时间
-newer f1 !f2:匹配比文件f1新但比f2旧的文件
-perm:匹配权限(mode为完全匹配,-mode为包含即可)
-user:匹配所有者
-group:匹配所有组
-nouser:匹配无所有者的文件
-nogroup:匹配无所属组的文件
-type b/d/c/p/l/f:匹配文件类型(后面的字母参数依次表示块设备、目录、字符设备、管道、链接文件、文本文件)
-prune:忽略某个目录下的文件,需要和-path一起使用
-depth:先从该目录子目录下查找,再查找该目录
-maxdepth levels:最多查找多少层目录
-mindepth levels:最少查找多少层目录
-delete:将找到的文件删除,如果是目录只能删除找到的空目录
6.1.4.1 指定搜索目录层级/深度

当我们在查找某个文件时,如果我们不希望搜索所有的子目录,我们可以指定搜索目录的深度。可以通过 -maxdepth 和 -mindepth 选项来指定。

例如,在家目录下搜索文件名称 myfile.txt 文件,搜索的深度为 1

# 未指定深度
[redhat@localhost ~]$ find /home/redhat -name myfile.txt
/home/redhat/Pictures/myfile.txt
/home/redhat/myfile.txt
/home/redhat/test/myfile.txt

# 指定深度
[redhat@localhost ~]$ find /home/redhat -maxdepth 1 -name myfile.txt
/home/redhat/myfile.txt
6.1.4.2 根据文件名和inode查找

相关选项:

-name "FILE_NAME"   文件名查找,支持使用glob:*、?、[]、[^]
-iname "FILE_NAME"  文件名查找,不区分大小写
-inum n             按inode号查找
-samefile name      查找与指定文件有相同inode号的文件,一般用于查找硬连接文件
-links n            查找连接数为N的文件
-regex "PATTERN"    以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称

示例1:查找 /etc 目录下所有文件名以 host 开头的文件

[root@localhost ~]# find /etc -name host*
/etc/host.conf
/etc/hosts
/etc/avahi/hosts
/etc/nvme/hostnqn
/etc/nvme/hostid
/etc/hostname

# 查找 /etc 目录下所有路径中包含有 ssh/ssh 的文件及路径
[root@localhost ~]# find /etc -path "*ssh/ssh*"
/etc/ssh/ssh_config
/etc/ssh/ssh_config.d
/etc/ssh/ssh_config.d/50-redhat.conf
/etc/ssh/sshd_config
/etc/ssh/sshd_config.d
/etc/ssh/sshd_config.d/50-redhat.conf
/etc/ssh/sshd_config.d/01-permitrootlogin.conf
/etc/ssh/ssh_host_ecdsa_key
/etc/ssh/ssh_host_ecdsa_key.pub
/etc/ssh/ssh_host_ed25519_key
/etc/ssh/ssh_host_ed25519_key.pub
/etc/ssh/ssh_host_rsa_key
/etc/ssh/ssh_host_rsa_key.pub

# 在当前目录下查找 anaconda-ks.cfg
[root@localhost ~]# find . -name anaconda-ks.cfg
./anaconda-ks.cfg

# 在当前目录下查找 anaconda-ks.cfg 文件并排除其自身
[root@localhost ~]# find . ! -name anaconda-ks.cfg
.
./.ssh
./.bash_logout
./.bash_profile

示例2:在当前目录下查找名为 file 文件

[root@bogon ~]# touch file
[root@bogon ~]# mkdir dir1
[root@bogon ~]# touch dir1/file
[root@bogon ~]# mkdir test
[root@bogon ~]# touch test/file

# 方式一
[root@bogon ~]# find . -name file
./file
./dir1/file
./test/file

# 方式二
[root@bogon ~]# find ~+ -name file
/root/file
/root/dir1/file
/root/test/file

# 方式三,$PWD 变量中存储的是用户当前的工作目录
[root@bogon ~]# echo $PWD
/root
[root@bogon ~]# cd /usr
[root@bogon usr]# echo $PWD
/usr
[root@bogon usr]# find $PWD -name file
/usr/bin/file
/usr/share/licenses/file
/usr/share/doc/file
/usr/share/bash-completion/completions/file
/usr/share/file
/usr/share/perl5/URI/file

# 方式四
[root@bogon usr]# echo $(pwd)
/usr
[root@bogon usr]# find $(pwd) -name file
/usr/bin/file
/usr/share/licenses/file
/usr/share/doc/file
/usr/share/bash-completion/completions/file
/usr/share/file
/usr/share/perl5/URI/file

示例3:在当前目录下查找名为 File 文件,不区分大小写

# 查找 File
[root@bogon usr]# find $PWD -name File
/usr/lib64/perl5/vendor_perl/File
/usr/lib64/perl5/auto/File
/usr/lib64/perl5/File
/usr/share/perl5/vendor_perl/File
/usr/share/perl5/File

# 查找 file
[root@bogon usr]# find $PWD -name file
/usr/bin/file
/usr/share/licenses/file
/usr/share/doc/file
/usr/share/bash-completion/completions/file
/usr/share/file
/usr/share/perl5/URI/file

# 不区分大小写的查找
[root@bogon usr]# find $PWD -iname file
/usr/bin/file
/usr/lib64/perl5/vendor_perl/File
/usr/lib64/perl5/auto/File
/usr/lib64/perl5/File
/usr/share/licenses/file
/usr/share/doc/file
/usr/share/bash-completion/completions/file
/usr/share/file
/usr/share/perl5/vendor_perl/File
/usr/share/perl5/URI/file
/usr/share/perl5/File

示例4:根据 inode 的值查找

[root@bogon ~]# ls -i
 34762509 anaconda-ks.cfg  101402577 Downloads   34762517 Public
 68797226 Desktop           34762529 file         1899311 Templates
101402579 dir1             101402582 Music        1909504 test
 68797229 Documents          1899314 Pictures    34762518 Videos

# 使用格式 find 路径 -inum inode的值
[root@bogon ~]# find . -inum 34762529
./file

示例5:在 /root 目录下查找链接数据为 1 的文件

[root@bogon ~]# find . -links 1
./.bash_logout
./.bash_profile
./.bashrc
./.cshrc
./.tcshrc
./anaconda-ks.cfg
./.cache/gnome-software/appstream/components.xmlb
./.cache/gnome-software/flatpak-system-default/components.xmlb
./.cache/gnome-software/flatpak-user-user/components.xmlb
......省略


# 与深度接合使用
[root@bogon ~]# find . -maxdepth 1 -links 1
./.bash_logout
./.bash_profile
./.bashrc
./.cshrc
./.tcshrc
./anaconda-ks.cfg
./.bash_history
./.Xauthority
./file
6.1.1.3 根据属主/属组查找

根据文件的属主及属组,我们可以查找符合指定属主、属组的文件,可以使用以下选项来实现:

-user username:查找属主为指定用户(UID)的文件
-group groupname:查找属组为指定用户组(GID)的文件
-uid UserId:查找属主为指定 UID 的文件
-gid GroupId:查找属组为指定 gid 的文件

示例1:在根目录下查找用户为 redhat 创建的文件

# 使用 -user 来查找
[root@bogon ~]# find / -maxdepth 3 -user redhat
/home/redhat/myfile.txt
/home/redhat/test
/home/redhat/test/myfile.txt
/home/redhat/.bash_history

# 或者使用 -uid 来查找
[root@bogon ~]# find / -maxdepth 3 -uid 1000
/home/redhat/Templates
/home/redhat/Public
/home/redhat/Documents
/home/redhat/Music
/home/redhat/Pictures
/home/redhat/Videos
/home/redhat/.cache
/home/redhat/myfile.txt
/home/redhat/test

示例2:在根目录下查找组为 redhat 创建的文件

[root@bogon ~]# find / -maxdepth 3 -group redhat
/home/redhat
/home/redhat/.mozilla
/home/redhat/.bash_logout
/home/redhat/.bash_profile

[root@bogon ~]# id redhat
uid=1000(redhat) gid=1000(redhat) groups=1000(redhat),10(wheel)

[root@bogon ~]# find / -maxdepth 3 -gid 1000
/home/redhat
/home/redhat/.mozilla
/home/redhat/.bash_logout
/home/redhat/.bash_profile
6.1.1.4 根据文件类型查找

在 Linux 中文件类型有 7 种,分别如下所示:

-f 普通文件,它是使用短横线(-)表示
-d 目录文件,它是使用(d)表示
-l 链接文件,它是使用(l)表示
-s 套接字文件,它是使用(s)表示
-b 块设备文件,它是使用(b)表示
-c 字符设备文件,它是使用(c)表示
-p 管道文件,它是使用(p)表示

这个查找的语法格式为:find [paht] -type 文件的类型

示例1:搜索 /dev 目录下的所有块设备文件

[root@bogon ~]# find /dev -type b
/dev/dm-1
/dev/dm-0
/dev/sr0
/dev/nvme0n1p2
/dev/nvme0n1p1
/dev/nvme0n1

示例2:搜索根目录下所有目录,深度为 1

[root@bogon ~]# find / -maxdepth 1 -type d
/
/boot
/dev
/proc
.......省略

示例3:搜索 /etc 目录下所有链接文件,深度为 2

[root@bogon ~]# find /etc -maxdepth 2 -type l
/etc/mtab
/etc/favicon.png
/etc/issue.d/cockpit.issue
/etc/os-release
/etc/system-release
/etc/pam.d/system-auth
/etc/pam.d/password-auth
/etc/pam.d/fingerprint-auth
/etc/pam.d/smartcard-auth
.....省略
6.1.1.5 根据文件大小查找

对于根据文件大小来进行查找,它的语法格式为:find [path] [选项] -size [+|-] n。其中 n 为文件的大小,单位为 c/k/M/G/T。

[+|-] n 的具体含义如下:
50k:搜索文件大小为 49k ~ 50k 之间的文件,即 n-1 ~ n
+50k:搜索大于 50k 的文件,即 n ~ ....
-50k:搜索小于 49k 的文件,即 0 ~ n-1

示例1:在 /root 目录下查找大小为 1k 的文件

[root@bogon ~]# find . -size 1k | grep cfg
./anaconda-ks.cfg

# 
bit = 8
byte = 1024 bit
kb = 1024byte
mb = 1024kb
gb = 1024mb 

示例2:在根目录下查找文件大小大于 100k 的文件

[root@bogon ~]# find / -size +100k
/boot/initramfs-0-rescue-5c5bb57619564f628a3f3f51cb63f773.img
/proc/kcore
find: ‘/proc/2342/task/2342/fd/5’: No such file or directory
find: ‘/proc/2342/task/2342/fdinfo/5’: No such file or directory
find: ‘/proc/2342/fd/6’: No such file or directory
find: ‘/proc/2342/fdinfo/6’: No such file or directory
/sys/devices/pci0000:00/0000:00:0f.0/resource1
/sys/devices/pci0000:00/0000:00:0f.0/resource1_wc
/var/lib/rpm/rpmdb.sqlite
/usr/lib/locale/locale-archive
/usr/lib/locale/locale-archive.real
6.1.1.6 根据时间戳查找

文件创建时会在元数据中生成访问时间(access time)、修改时间(modify time)以及创建时间(create time),它们分别简写为:atime、mtime 和 ctime。

这种查找方式的语法为:

find [path] [选项] [file]
选项:
	以天为单位(time)的查找。
	-atime [+|-]时间:按照文件的访问时间搜索
		+:表示(+1)天之外被访问的文件
		-:表示 1 天之内被访问的文件
		
	-mtime [+|-]时间:按照文件的修改时间搜索
	-ctime [+|-]时间:按照文件的创建时间搜索
	
	以分钟为单位(min)的查找:
	-amin [+|-]:按照文件的访问时间搜索
	-mmin [+|-]:按照文件的修改时间搜索
	-cmin [+|-]:按照文件的创建时间搜索
	
	-newer file:把比 file 文件修改时间更新的文件搜索出来

示例1:搜索根目录下所有在 1 天之外被访问过的文件

[root@bogon ~]# find / -atime +1

[root@bogon ~]# find / -atime +1 | wc -l
find: ‘/proc/2349/task/2349/fd/5’: No such file or directory
find: ‘/proc/2349/task/2349/fdinfo/5’: No such file or directory
find: ‘/proc/2349/fd/6’: No such file or directory
find: ‘/proc/2349/fdinfo/6’: No such file or directory
125678

示例2:搜索根目录下所有在 1 天之内被访问过的文件

[root@bogon ~]# find / -atime -1 | wc -l
find: ‘/proc/2352/task/2352/fd/5’: No such file or directory
find: ‘/proc/2352/task/2352/fdinfo/5’: No such file or directory
find: ‘/proc/2352/fd/6’: No such file or directory
find: ‘/proc/2352/fdinfo/6’: No such file or directory
233889

示例3:查找根据目录下 5 分钟以内创建的文件

[root@bogon ~]# find / -cmin -5

[root@bogon ~]# touch aa
[root@bogon ~]# find . -cmin -5
.
./aa

示例4:查找当前目录下比 2023-12-4 20:30 分之前创建的文件

[root@bogon ~]# find . -type f -newerct '2023-12-3 20:28'
./aa
# 命令说明:
# -type f  表示搜索文件
# -newerct 表示搜索比指定时间更早创建的文件,其中 c 表示创建,这个位置还可以是 m、a。t 表示后面要跟具体的时间格式
6.1.1.7 根据权限查找

我们可以根据文件的三类访问对象的三种权限来查找对应的文件,命令的语法格式为:

find [path] -perm [+|-] MODE
  MODE:表示精确匹配三类对象(u,g,o)的权限
  +MODE:表示三类对象只要有一类对象中的三个权限匹配一位即
  -MODE:表示三类对象分别有对应权限
  
  简单来说:
  -perm 权限模式:查找文件的权限刚好等于指定的权限的文件
  -perm +权限模式:查找文件的权限包含“权限模式”的任意一个权限的文件
  -perm -权限模式:查找文件的权限全部包含“权限模式”的文件

示例1:如果要在整个文件系统搜索权限中包括 SUID 权限的所有文件,只需要使用 -400 即可。

[root@bogon ~]# find / -perm -400
/usr/lib/python3.9/site-packages/tracer/hooks.py
/usr/lib/python3.9/site-packages/tracer/main.py
.....省略

示例2:在当前目录下搜索文件名称以 f 开头,并且权限为 311 的所有文件

[root@bogon ~]# find . -name 'f*' -perm -311
./.cache/gnome-software/flatpak-system-default
./.cache/gnome-software/flatpak-user-user
./.local/share/flatpak

6.2 普通权限*****

6.2.1 权限介绍

我们以查看 /roo 目录下的所有文件的详细信息为例,来说明普通权限。

[root@bogon ~]# ll
total 4
-rw-r--r--. 1 root root   0 Dec  3 20:28 aa

在上面的命令输出结果中包括了如下部分:

-rw-r--r--. 1 root root   0 Dec  3 20:28 aa
1           2 3    4      5 6            7

1 这个部分包括文件类型、所属者权限、所属组权限、其它人权限、控制列表权限
2 文件的链接数
3 文件所属者,即文件的创建者
4 文件所属组
5 文件的大小,单位为字节
6 文件的最后一次修改时间
7 文件名/目录名称

接下来我们重点来说第一个部分,即:

-  rw-  r--  r--  .
1  2    3    4    5

1 表示文件的类型
   - 普通文件
   d 目录
   l 链接文件
   c 字符设备文件
   b 块设备文件
   p 管道文件
   s 套接字文件
   
2 表示文件所属者权限,可以用 u(user) 表示
   - 表示无权限
   r 表示读
   w 表示写
   x 表示可执行
  
3 表示文件所属组权限,可以用 g(group) 表示
   - 表示无权限
   r 表示读
   w 表示写
   x 表示可执行

4 表示其它用户(既不是所属者,也不是所属组中的用户)的权限,可以用 o(other) 表示
   - 表示无权限
   r 表示读
   w 表示写
   x 表示可执行
   
5 表示访问控制列表
   . 表示没有设置访问控制列表
   + 表示设置了访问控制列表

注意:root 账户不受文件权限的读写限制,执行权限受限制

对文件和目录来说,它们对于 r、w、x 的表现形式是不一样的。

对于文件的影响:
	r(read):表示可以读取文件的内容
	w(write):表示可以修改文件的内容
	x(eXecute):表示可以执行这个文件
	
	对于文件来说可能出现的权限有:
		---:没有权限
		r--:表示只读		
		r-x:表示可读可执行
		rw-:表示可读写
		rwx:所有权限都有
		
		总结:文件权限中包括 r 权限
	
	
对于目录的影响:
	r:表示可以列出目录下的内容,即可以查看目录下的文件名称
	w:表示可以创建、删除目录中的任意文件(但是要注意:如果只有 w 权限,是不能删除文件的,它需要和 x 权限一起使用)
	x:表示可以切换目录
	
	对于目录来说可能出现的权限:
		---:表示没有权限
		r-x:表示可读可进入
		rwx:表示所有权限
		
		总结:目录权限中包括 r 和 x 权限

权限的数字表示法:

权限			二进制			八进制
---			 000		   0
--x			 001		   1
-w-			 010		   2
-wx			 011		   3
r--			 100		   4
r-x			 101		   5
rw-			 110		   6
rwx			 111		   7

6.2.2 修改文件或目录权限

修改文件或目录的权限需要使用 chmod(change mode)命令来实现,它的语法格式为:

chmod [选项] [ugoa][+-=][rwx] 文件或目录.....
或者
chmod [选项] nnn 文件或目录.......

选项:
	-R:表示递归修改指定目录下所有文件及其子目录的权限

`ugoa`:表示权限设置所针对的用户类型,可以是其中字母的一个或组合。
	u 表示所属者
	g 表示所属组
	o表示其他用户
	a 表示(u+g+o)

`+-=`:表示设置权限的操作动作。
	+ 表示添加某个权限
	- 表示取消某个权限
	= 表示赋值某个权限

`rwx`:用字符形式表示所设置的权限,可以是一个字母或组合。
	r:读
	w:写
	x:执行
	
`nnn`:用三位八进制数字来表示权限
	r=4
	w=2
	x=1
	
	rwx
	x表示 2 的 0 次方 = 1
	w表示 2 的 1 次方 = 2
	r表示 2 的 2 次方 = 4

示例1:修改某一类人【所属者、所属组、其他人】的权限,我们分别演示对文件和目录的权限

chmod [选项] [ugoa][+-=][rwx] 文件或目录.....
或者
chmod [选项] nnn 文件或目录.......

# 为了演示这些功能,我们以 root 用户在 /opt 目录下新建一个file1文件和test目录
[root@bogon ~]# cd /opt
[root@bogon opt]# ll
total 0
[root@bogon opt]# touch file1
[root@bogon opt]# ll
total 0
-rw-r--r--. 1 root root 0 Dec  9 19:37 file1
[root@bogon opt]# mkdir -p test
[root@bogon opt]# ll
total 0
-rw-r--r--. 1 root root 0 Dec  9 19:37 file1
drwxr-xr-x. 2 root root 6 Dec  9 19:37 test
[root@bogon opt]# cd test
[root@bogon test]# touch file2
[root@bogon test]# ll
total 0
-rw-r--r--. 1 root root 0 Dec  9 19:38 file2
[root@bogon test]# 

#----- 然后切换到 redhat 用户
[root@bogon test]# su - redhat
[redhat@bogon ~]$ ll /opt
total 0
-rw-r--r--. 1 root root  0 Dec  9 19:37 file1
drwxr-xr-x. 2 root root 19 Dec  9 19:38 test
[redhat@bogon ~]$ cd /opt
[redhat@bogon opt]$ ls
file1  test
[redhat@bogon opt]$ echo 123 > file1
-bash: file1: Permission denied
[redhat@bogon opt]$ cat file1
[redhat@bogon opt]$ 
# 切换后,可以发现,redhat 这个用户对于  /opt/file1 文件只具有可读的权限,而其他权限不是具备的。

# 现在我们让 redhat 用户具有对 /opt/file1 文件具有可写的权限

# 我们以 root 用户来为 file1 文件的其他用户赋予可读可写权限
[root@bogon opt]# chmod o=rw- file1
[root@bogon opt]# 

# 赋值成功后,切换到 redhat 用户
[redhat@bogon opt]$ ll
total 0
-rw-r--r--. 1 root root  0 Dec  9 19:37 file1
drwxr-xr-x. 2 root root 19 Dec  9 19:38 test
[redhat@bogon opt]$ ll
total 0
-rw-r--rw-. 1 root root  0 Dec  9 19:37 file1
drwxr-xr-x. 2 root root 19 Dec  9 19:38 test
[redhat@bogon opt]$ echo 123 > file1
[redhat@bogon opt]$ cat file1
# 从上面的结果可以发现,redhat 用户已经对 file1 文件具有了可读可写的权限了。

# 注意:在赋予权限时,= 号表示给它刚好这个权限,如果希望在原有的权限基础上添加某个权限,需要使用 + 号
[root@bogon opt]# chmod o+r file1

[redhat@bogon opt]$ ll
total 4
-rw-r--rw-. 1 root root  8 Dec  9 19:48 file1
drwxr-xr-x. 2 root root 19 Dec  9 19:38 test

# 如果希望给某个用户取消某个权限,则需要使用 - 号,例如,我们对 /opt/file1 文件的其他用户权限可写权限,则操作如下:
[root@bogon opt]# chmod o-w file1

[redhat@bogon opt]$ ll
total 4
-rw-r--r--. 1 root root  8 Dec  9 19:48 file1
drwxr-xr-x. 2 root root 19 Dec  9 19:38 test


#-----------------------------
# 当然,我们还可以使用数字的方式来设置权限。例如,我们给 /opt/file1 文件的其他用户设置权限为可卖可写
[root@bogon opt]# chmod 644 file1	# 这是设置整个 file1 的权限,而我们的需求是对其他用户,所以这个不能满足我们的题目要求。而能满足题目要求如下所示:
[root@bogon opt]# chmod 646 file1

#--------------------------------
# r w -          r - -         r w -
# 4 2 0          4 0 0         4 2 0
# 6              4             6
# 646

#----------------------------
# 1. 使用 root 用户对 /opt/test 目录的其他用户的可执行权限取消
[root@bogon opt]# chmod o-x test
# 2. 使用 redhat 用户来切换这个目录
[redhat@bogon opt]$ ll
total 4
-rw-r--rw-. 1 root root  8 Dec  9 19:48 file1
drwxr-xr--. 2 root root 19 Dec  9 19:38 test
[redhat@bogon opt]$ cd test
-bash: cd: test: Permission denied
# 发现已经不能成功切换了,说明权限设置成功。

# 需求:给 /opt/test 目录及子目录和文件都添加 w 权限
[root@bogon opt]# chmod -R o+w test


[redhat@bogon opt]$ ll
total 4
-rw-r--rw-. 1 root root  8 Dec  9 19:48 file1
drwxr-xrwx. 2 root root 19 Dec  9 19:38 test
[redhat@bogon opt]$ cd test
[redhat@bogon test]$ ll
total 0
-rw-r--rw-. 1 root root 0 Dec  9 19:38 file2

6.2.3 修改文件或目录的属主和属组

修改文件或目录的所属者以及所属组的权限的语法为:

# 1. 修改文件或目录的所属者权限(change owner)
chown [选项] 新所属者[:[新所属组]] 文件或目录....
	选项:
		-R :对目录来说表示递归

# 2. 修改文件或目录所属组权限
chown [选项] :新所属组 文件或目录.....
或者
chgrp [选项] 新所属组 文件或目录.....

使用示例:修改/opt/目录下的所有文件和目录权限

#-------------- 对文件-----------------
# 1. 将 /opt/file1 文件的所属者修改为 redhat
# 查看当前所属者权限,目前为 root
[redhat@bogon opt]$ ll
total 4
-rw-r--rw-. 1 root root  8 Dec  9 19:48 file1
drwxr-xrwx. 2 root root 19 Dec  9 19:38 test
# 将文件的所属者从 root 修改为 redhat
[root@bogon opt]# chown redhat file1

[redhat@bogon opt]$ ll
total 4
-rw-r--rw-. 1 redhat root  8 Dec  9 19:48 file1
drwxr-xrwx. 2 root   root 19 Dec  9 19:38 test

# 2. 将 /opt/file1 文件的所属组修改为 redhat
[root@bogon opt]# chown :redhat file1

[redhat@bogon opt]$ ll
total 4
-rw-r--rw-. 1 redhat redhat  8 Dec  9 19:48 file1
drwxr-xrwx. 2 root   root   19 Dec  9 19:38 test

#-------------对目录--------------------
# 3. 修改 /opt/test 目录所属者为 redhat
[root@bogon opt]# chown -R redhat test

[redhat@bogon opt]$ ll test
total 0
-rw-r--rw-. 1 root root 0 Dec  9 19:38 file2
[redhat@bogon opt]$ ll
total 4
-rw-r--rw-. 1 redhat redhat  8 Dec  9 19:48 file1
drwxr-xrwx. 2 redhat root   19 Dec  9 19:38 test
[redhat@bogon opt]$ ll test
total 0
-rw-r--rw-. 1 redhat root 0 Dec  9 19:38 file2

# 4. 修改 /opt/test 目录所属组为 redhat
[root@bogon opt]# chown -R :redhat test

[redhat@bogon opt]$ ll 
total 4
-rw-r--rw-. 1 redhat redhat  8 Dec  9 19:48 file1
drwxr-xrwx. 2 redhat redhat 19 Dec  9 19:38 test
[redhat@bogon opt]$ ll test
total 0
-rw-r--rw-. 1 redhat redhat 0 Dec  9 19:38 file2

总结:

  1. chmod 命令是用于给文件或目录设置权限,如果是目录,我们需要使用 -R 选项,如果是文件这个选项可以不用指定。使用这个命令我们可以使用 rwx 或者数字来表示权限,还可以通过 u、g、o、a 来表示对那个部分设置权限。

  2. chown 命令是用于给文件或目录修改所属者和所属组权限。如果只修改所属者则使用 chown 新所属者 文件或目录....,如果只修改所属组则使用chown :新所属组 文件或目录....`。

  3. 如果我们希望同时给文件或目录修改所属者和所属组,则使用 chown 新所属者:新所属组 文件或目录....

例如:将 /opt/test 目录的所属者和所属组都改为 root,则命令如下:

[root@bogon opt]# chown -R root:root test

[redhat@bogon opt]$ ll
total 4
-rw-r--rw-. 1 redhat redhat  8 Dec  9 19:48 file1
drwxr-xrwx. 2 root   root   19 Dec  9 19:38 test

注意:如果单纯的就只希望修改所属组,则可以使用 chgrp 命令

[root@bogon opt]# chgrp -R redhat test

[redhat@bogon opt]$ ll
total 4
-rw-r--rw-. 1 redhat redhat  8 Dec  9 19:48 file1
drwxr-xrwx. 2 root   redhat 19 Dec  9 19:38 test

6.3 ACL权限*****

为什么需要有 ACL 权限,原因是我们现在只能对所属者、所属组以及其他用户来进行统一设置。

通过 ACL 可给指定的用户指定的目录分配指定的权限。

对于 ACL 权限来说,它有设置 ACL 权限、查看 ACL 权限和删除 ACL 权限。

6.3.1 设置 ACL 权限*****

设置 ACL 权限的语法如下:

setfacl [选项] 文件名

选项
	-m:设置 acl 权限。如果是给用户 acl 权限,则使用的格式为:`u:用户名:权限`;如果是给组设置 acl 权限,则使用的格式为 `g:组名:权限`
	-x:删除指定 acl 权限
	-b:删除所有的 acl 权限
	-d:设定默认的 acl 权限,只对目录生效,指目录中新建的文件拥有此默认的权限
	-k:删除设置的默认 acl 权限
	-R:递归设置 acl 权限,当指定后会对当前目录及子目录生效

文件访问控制列表	FACL:	filename	access	control	list
setfacl	-m	u:username:mode	filename	# -m 修改
setfacl -m	g:groupname:mode	filename # -m 修改
setfacl -x 	u:username:mode	filename	# -x 删除
setfacl -x	g:groupname:mode	filename # -x 删除
setfacl -b filename		# -b 删除/恢复

使用示例:

1)首先我们使用 root 用户在根目录下新建一个文件目录名为 /project,此文件上当的权限是 770

2)然后创建一个 QQ 群所属组,所属组里面创建两个用户 zhangsan 和 lisi,并把这个组设置为 /project 的所属组

3)接着创建一个旁听用户 pt,给他设定 /project 目录的 acl 权限为 r-x

4)最后再创建一个叫 xiaowu 组,并将 xiaowu 组设置为 /project 组 acl 权限为 rwx 权限

# 1)首先我们使用 root 用户在根目录下新建一个文件目录名为 /project,此文件上当的权限是 770
[root@bogon opt]# mkdir -p /project
[root@bogon opt]# ll -d /project
drwxr-xr-x. 2 root root 6 Dec  9 21:13 /project
[root@bogon opt]# chmod -R 770 /project
[root@bogon opt]# ll -d /project
drwxrwx---. 2 root root 6 Dec  9 21:13 /project


# 2)然后创建一个 QQ 群所属组,所属组里面创建两个用户 zhangsan 和 lisi,并把这个组设置为 /project 的所属组
[root@bogon opt]# groupadd QQ
[root@bogon opt]# useradd -g QQ zhangsan
[root@bogon opt]# id zhangsan
uid=1001(zhangsan) gid=1001(QQ) groups=1001(QQ)
[root@bogon opt]# useradd -g QQ lisi
[root@bogon opt]# id lisi
uid=1002(lisi) gid=1001(QQ) groups=1001(QQ)
[root@bogon opt]# ll -d /project
drwxrwx---. 2 root root 6 Dec  9 21:13 /project
[root@bogon opt]# chown -R :QQ /project
[root@bogon opt]# ll -d /project
drwxrwx---. 2 root QQ 6 Dec  9 21:13 /project


# 3)接着创建一个旁听用户 pt,给他设定 /project 目录的 acl 权限为 r-x
# 创建用户
[root@bogon opt]# useradd pt
[root@bogon opt]# ll -d /project
drwxrwx---. 2 root QQ 6 Dec  9 21:13 /project
# 设置acl权限
[root@bogon opt]# setfacl -m u:pt:r-x /project
[root@bogon opt]# ll -d /project
drwxrwx---+ 2 root QQ 6 Dec  9 21:13 /project
# 可以发现,acl 权限设置成功

为了验证 acl 权限是否设置成功,我们给 pt 用户设置登录密码:

[root@bogon opt]# passwd pt
Changing password for user pt.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.

然后再切换到 pt 用户,并访问 /project 目录

[pt@bogon ~]$ ll /project
total 0
[pt@bogon ~]$ 

发现可以访问,说明给 pt 用户设置/project目录的 acl 权限成功。

# 4)最后再创建一个叫 xiaowu 组,并将 xiaowu 组设置为 /project 组 acl 权限为 rwx 权限
# 创建 xiaowu 组
[root@bogon project]# groupadd xiaowu
# 设置组 acl 权限
[root@bogon project]# setfacl -m g:xiaowu:rwx /project
[root@bogon project]# ll -d /project
drwxrwx---+ 2 root QQ 6 Dec  9 21:13 /project


# 验证这个 acl 权限是否设置成功
[root@bogon project]# useradd haha
[root@bogon project]# id haha
uid=1004(haha) gid=1005(haha) groups=1005(haha)

# 切换 haha 用户
[root@bogon project]# su - haha
[haha@bogon ~]$ 
# 在 haha 用户下切换到 /project 目录
[haha@bogon ~]$ cd /project
-bash: cd: /project: Permission denied
[haha@bogon ~]$ exit
logout
# 设置用户组
[root@bogon project]# usermod -g xiaowu haha
[root@bogon project]# id haha
uid=1004(haha) gid=1004(xiaowu) groups=1004(xiaowu)
# 切换用户
[root@bogon project]# su - haha
# 进入 /project
[haha@bogon ~]$ cd /project
[haha@bogon project]$ touch file1
[haha@bogon project]$ mkdir test
[haha@bogon project]$ ll
total 0
-rw-r--r--. 1 haha xiaowu 0 Dec 10 19:23 file1
drwxr-xr-x. 2 haha xiaowu 6 Dec 10 19:23 test
[haha@bogon project]$ rm -rf test
[haha@bogon project]$ ll
total 0
-rw-r--r--. 1 haha xiaowu 0 Dec 10 19:23 file1

6.3.2 查看 ACL 权限

查看 ACL 权限的语法为:

getfacl 文件名目录

使用示例:查看 /project 的 acl 权限

[haha@bogon project]$ getfacl /project
getfacl: Removing leading '/' from absolute path names
# file: project
# owner: root
# group: QQ
user::rwx
user:pt:r-x
group::rwx
group:xiaowu:rwx
mask::rwx
other::---

[haha@bogon project]$ 

6.3.3 删除 ACL 权限

删除 ACL 权限的语法为:

setfacl -x|-b u:用户名 文件或目录
或者
setfacl -x|-b g:组名 文件或目录

使用示例:

# 1. 删除 /project 目录对 pt 用户的 acl 权限
[root@bogon project]# setfacl -x u:pt /project
# 验证删除结果
[root@bogon project]# getfacl /project
getfacl: Removing leading '/' from absolute path names
# file: project
# owner: root
# group: QQ
user::rwx
group::rwx
group:xiaowu:rwx
mask::rwx
other::---

# 2. 删除 xiaowu 组的 acl 权限
[root@bogon project]# setfacl -x g:xiaowu /project
[root@bogon project]# getfacl /project
getfacl: Removing leading '/' from absolute path names
# file: project
# owner: root
# group: QQ
user::rwx
group::rwx
mask::rwx
other::---

# 3. 删除 /project 目录的所有 acl 权限
[root@bogon project]# setfacl -b /project
[root@bogon project]# getfacl /project
getfacl: Removing leading '/' from absolute path names
# file: project
# owner: root
# group: QQ
user::rwx
group::rwx
other::---

6.3.4 ACL 权限适用场景

当所有权限都不能动,但又希望给其他某个人或组设置一定权限时,就可以使用 acl 访问控制列表。

6.4 特殊权限

在 Linux 中,用户对文件或目录的访问权限除了 r、w、x 这三种一般权限外,还有 SUID(Set User Id)、SGID(Set Group Id)、Sticky Bit(粘滞位)三种特殊权限,用于对文件或目录进行更加灵活且方便的访问控制。

6.4.1 SUID权限

SUID 特殊权限仅适用于可执行文件,所具有的功能是:只要用户设有 SUID 的文件有可执行权限,那么当用户执行此文件时,会以文件所有者身份去执行这个文件,一旦文件执行结束,身份的切换也随之消失。

举例:我们知道 Linux 中所有的用户密码数据都记录在 /etc/shadow 文件中,通过 ll 命令查看可以发现,这个文件所有用户都没有权限。因为都为 0,也就是说,普通用户原则是没办法修改密码的。

[root@bogon project]# ll /etc/shadow
----------. 1 root root 1390 Dec 10 19:20 /etc/shadow

[root@bogon ~]# passwd pt
Changing password for user pt.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.

通过上面的示例,我们发现, root 虽然看上去没有对 /etc/shadow 这个文件有任何的操作权限,但是它却可以修改用户的密码,并且可以成功。原因就是 passwd 命令具有 SUID 权限。

[root@bogon ~]# which passwd
/usr/bin/passwd
[root@bogon ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 32648 Aug 10  2021 /usr/bin/passwd

我们发现:/usr/bin/passwd,即 passwd 命令具有 SUID 权限,s 是标记在 x 的所在位置,表示执行这个命令时,可以具有这个文件创建者的权限。

注意:在 Linux 系统中,绝大多数命令的文件所属者默认都是 root

为了便于大家理解,我们把 /usr/bin/passwd 文件的 suid 权限取消。

[root@bogon ~]# chmod u-s /usr/bin/passwd
[root@bogon ~]# ll /usr/bin/passwd
-rwxr-xr-x. 1 root root 32648 Aug 10  2021 /usr/bin/passwd

[root@bogon ~]# passwd pt
Changing password for user pt.
New password: 
BAD PASSWORD: The password is a palindrome
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@bogon ~]# su - pt
[pt@bogon ~]$ passwd
Changing password for user pt.
Current password: 
Current Password: 
passwd: Authentication token manipulation error

执行流程:

第6章 文件系统权限_第1张图片

我们来为 cat 命令设置 suid 权限,从而让普通用户也具有查看 /etc/shadow 文件内容的权限。

# 为 /usr/bin/cat 命令设置 suid 权限
[root@bogon ~]# chmod u+s /usr/bin/cat

# 查看权限是否设置成功
[root@bogon ~]# ll /usr/bin/cat
-rwsr-xr-x. 1 root root 36320 Jan  6  2023 /usr/bin/cat

# 切换为普通用户
[root@bogon ~]# su - pt

# 使用普通用户来使用 cat 命令,此时,由于 cat 命令具有 suid 权限,它在执行时,会以这个命令的所属者(root)的身份来执行这个命令
[pt@bogon ~]$ cat /etc/shadow
root:$6$w.4NX9m.wQ/s9qV7$x4a39kSlTgm5jITx9RV46nNib1c/d3Qn3nRc69g8KaIJR3Qkl65E1S3yDV2rczu71tS.uLwJRQf3dj7t8w3a01::0:99999:7:::
bin:*:19347:0:99999:7:::
daemon:*:19347:0:99999:7:::

在 Linux 中,那些命令具有 SUID 权限?

我们可以使用如下的方式来查找:

[root@bogon ~]# find / -perm /4000

0 表示没有权限
4 表示拥有者具有 s 权限位
/4000 表示权限至少是具有 s 权限

6.4.2 SGID权限

与 SUID 不同:SUID 是针对所属者具有 s 权限,而 SGID 是针对所属组具有 s 权限。

  • 对于文件:只针对可执行文件,会以文件所属组中用户的身份进行执行

  • 对于目录:当一个目录被赋予 SGID 权限后,进入此目录的普通用户,其有效群组会变为该目录所属组权限。

使用示例:

# 查看 /tmp 目录权限
[root@bogon ~]# ll -d /tmp
drwxrwxrwt. 19 root root 4096 Dec 10 20:17 /tmp

# 进入到 /tmp 目录
[root@bogon ~]# cd /tmp

# 在/tmp目录下新建 dtest 目录
[root@bogon tmp]# mkdir dtest
[root@bogon tmp]# ll
total 0
drwxr-xr-x. 2 root root  6 Dec 10 20:38 dtest

# 给 dtest 目录设置 sgid 权限
[root@bogon tmp]# chmod g+s dtest
[root@bogon tmp]# ll -d dtest
drwxr-sr-x. 2 root root 6 Dec 10 20:38 dtest
# 通过上面的命令执行后,会在目录所属组的 x 位置设置为 s 权限

# 给测试上当赋予 777 权限,让普通用户可以写
[root@bogon tmp]# chmod 777 dtest
[root@bogon tmp]# ll -d dtest
drwxrwsrwx. 2 root root 6 Dec 10 20:38 dtest

# 切换为 redhat 普通用户,由于这个用户的所属组是 redhat,所以我们通过它来进行测试
[root@bogon tmp]# su - redhat
[redhat@bogon ~]$ grep redhat /etc/passwd /etc/group
/etc/passwd:redhat:x:1000:1000:redhat:/home/redhat:/bin/bash
/etc/group:wheel:x:10:redhat
/etc/group:redhat:x:1000:

# 用这个普通用户进入到 /tmp/dtest 目录
[redhat@bogon ~]$ cd /tmp/dtest
[redhat@bogon dtest]$ 

# 然后使用这个普通用户在 /tmp/dtest 目录下新建 adb 文件和 zimulu 子目录
[redhat@bogon dtest]$ touch abc
[redhat@bogon dtest]$ mkdir zimulu
[redhat@bogon dtest]$ ll
total 0
-rw-r--r--. 1 redhat root 0 Dec 10 20:46 abc
drwxr-sr-x. 2 redhat root 6 Dec 10 20:47 zimulu

可以看到:虽然是 redhat 这个普通用户创建的 abc 文件和 zimulu 目录,但它们的所属组都不是 redhat,而是 dtest 这个目录所创建时的所属组

6.4.3 SBIT权限

这个权限只针对目录有效,对文件无效。对目录的作用是:在具有 SBIT 权限的目录下,用户若在该目录下具有 w 及 x 权限,则当用户在该目录下建立文件或目录时,只有文件拥有者与 root 才有权力删除。

下面通过一系列的命令来演示 SBIT 权限对 /data 目录的作用:

# 创建要操作的 /data 目录
[root@bogon project]# mkdir /data

# 对这个目录设置 777 权限
[root@bogon project]# cd /data
[root@bogon data]# ll -d /data
drwxr-xr-x. 2 root root 6 Dec 10 21:00 /data
# 下面的两种方式一样
[root@bogon data]# chmod 777 /data
[root@bogon data]# chmod a+rwx /data

[root@bogon data]# ll -d /data
drwxrwxrwx. 2 root root 6 Dec 10 21:00 /data


# 接下来我们创建两个用户:lamp1 和 lamp2
[root@bogon data]# useradd lamp1
[root@bogon data]# useradd lamp2

# 切换到 lamp1 用户
[root@bogon data]# su - lamp1
[lamp1@bogon ~]$ cd /data

# 在这个目录下新建 ftest 文件
[lamp1@bogon data]$ touch ftest
[lamp1@bogon data]$ ll ftest
-rw-r--r--. 1 lamp1 lamp1 0 Dec 10 21:04 ftest

# 切换到 lamp2 用户
[lamp1@bogon data]$ exit
logout
[root@bogon data]# su - lamp2
[lamp2@bogon ~]$ cd /data
# 然后使用 lamp2 用户来删除 ftest 文件
[lamp2@bogon data]$ rm -f ftest
[lamp2@bogon data]$ ll
total 0
# 发现可以删除

# 现在的需求:我们不希望别的用户能够删除 lamp1 用户所创建的 ftest 文件,如何实现?

# 要实现这个功能,我们通过下面的步骤来完成:
# 1. 切换加 root 用户
[lamp2@bogon data]$ exit
logout
[root@bogon data]# 

# 2. 通过 root 用户给 /data 目录设置 SBIT 权限,设置这个权限我们有以下三种方式:
# 1)chmod +t 目录
# 2)chmod o+t 目录
# 3)chmod a+t 目录
# 无论使用的是哪种方式,最终都只会给其他用户所在的权限位置的最后,即 x 位置上设置为 t
[root@bogon data]# chmod +t /data
[root@bogon data]# ll -d /data
drwxrwxrwt. 2 root root 6 Dec 10 21:05 /data

# 3. 切换到 lamp1 用户并在 /data 目录下新建 ftest 文件
[root@bogon data]# su - lamp1
[lamp1@bogon ~]$ cd /data
[lamp1@bogon data]$ ll
total 0
[lamp1@bogon data]$ touch ftest
[lamp1@bogon data]$ ll
total 0
-rw-r--r--. 1 lamp1 lamp1 0 Dec 10 21:11 ftest

# 4. 切换加 root 用户后再切换到 lamp2 用户,并使用这个用户来删除 ftest 文件
[lamp1@bogon data]$ exit
logout
[root@bogon data]# su - lamp2
[lamp2@bogon ~]$ cd /data
[lamp2@bogon data]$ rm -f ftest
rm: cannot remove 'ftest': Operation not permitted

# 5. 使用 root 用户来删除 ftest 文件
[lamp2@bogon data]$ exit
logout
[root@bogon data]# rm -f ftest
[root@bogon data]# ll
total 0

发现:当我们为 /data 目录设置了 SBIT 权限后,那么,某个用户所创建的文件,只能是创建这个文件的所属者或 root 用户才可以删除,其他用户不能删除。

6.5 权限掩码(了解)

6.5.1 新建文件或目录的默认权限

我们在创建文件或目录时,在 Linux 中会去查找 /etc/login.defs 文件中查看默认的掩码:

UMASK		022

除了可以通过查看 /etc/login.defs 外,我们还可以使用 umask 命令来查看默认的掩码:

[root@bogon data]# umask
0022

问题:我们说权限不应该是 3 个数字吗?为啥是 4 个?

回答:这是因为掩码做的是 4 个八进制数来表示的。第 1 个数表示的文件所具有的 SUD、SGID、SBIT 权限。后面 3 位才表示 umask 权限。将其转换为字母就是 ----w--w-

文件和目录的真正初始权限,可通过以下的计算得到:

文件(或目录)的初始权限 = 文件(或目录)的最大默认权限 - umask权限

显然,如果想最终得到文件或目录的初始权限值,我们还需要了解文件和目录的最大默认权限值。在 Linux 系统中,文件和目录的最大默认权限是不一样的:

  • 对文件来讲,其可拥有的最大默认权限是 666,即 rw-rw-rw-。也就是说,使用文件的任何用户都没有执行(x)权限。原因很简单,执行权限是文件的最高权限,赋予时绝对要慎重,因此绝不能在新建文件的时候就默认赋予,只能通过用户手工赋予。

  • 对目录来讲,其可拥有的最大默认权限是 777,即 rwxrwxrwx。

接下来,我们利用字母权限的方式计算文件或目录的初始权限。以 umask 值为 022 为例,分别计算新建文件和目录的初始权限:

  • 文件的最大默认权限是 666,换算成字母就是 "-rw-rw-rw-",umask 的值是 022,换算成字母为 "-----w--w-"。把两个字母权限相减,得到 (-rw-rw-rw-) - (-----w--w-) = (-rw-r--r--),这就是新建文件的初始权限。我们测试一下:

    [root@localhost ~]# umask
    0022
    # 默认umask的值是0022
    
    # 新建file空文件
    [root@localhost ~]# touch file
    [root@localhost ~]# ll -d file
    -rw-r--r--. 1 root root 0 Apr 18 02:36 file
  • 目录的默认权限最大可以是 777,换算成字母就是 "drwxrwxrwx",umask 的值是 022,也就是 "-----w--w-"。把两个字母权限相减,得到的就是新建目录的默认权限,即 (drwxrwxrwx) - (-----w--w-) = (drwxr-xr-x)。我们再来测试一下:

    [root@localhost ~]# umask
    0022
    
    # 新建catalog目录
    [root@localhost ~]# mkdir catalog
    [root@localhost ~]# ll -d catalog
    drwxr-xr-x. 2 root root 4096 Apr 18 02:36 catalog

注意,在计算文件或目录的初始权限时,不能直接使用最大默认权限和 umask 权限的数字形式做减法,这是不对的。例如,若 umask 默认权限的值为 033,按照数字形式计算文件的初始权限,666-033=633,但我们按照字母的形式计算会得到 (rw-rw-rw-) - (----wx-wx) = (rw-r--r--),换算成数字形式是 644。

6.5.2 权限修改

umask 权限值可以通过如下命令直接修改:

#修改shell umask值(临时)
[root@localhost ~]# umask 002
[root@localhost ~]# umask
0002
[root@localhost ~]# mkdir dir8
[root@localhost ~]# touch file8
[root@localhost ~]# ll -d dir8 file8 
drwxrwxrwx. 2 root root 4096 3月  11 19:44 dir8
-rw-rw-rw-. 1 root root    0 3月  11 19:44 file8

[root@localhost ~]# umask 033
[root@localhost ~]# umask
0033
[root@localhost ~]# mkdir dir9
[root@localhost ~]# touch file9
[root@localhost ~]# ll -d dir9 file9 
drwxrwxrwx. 2 root root 4096 3月  11 19:44 dir9
-rw-rw-rw-. 1 root root    0 3月  11 19:44 file9

不过,这种方式修改的 umask 只是临时有效,一旦重启或重新登陆系统,就会失效。如果想让修改永久生效,则需要修改对应的环境变量配置文件 /etc/profile。例如:

# 修改shell umask值(永久)
[root@localhost ~]# vim /etc/profile
...省略部分内容...
if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
    umask 002
    # 如果UID大于199(普通用户),则使用此umask值
else
    umask 022
    # 如果UID小于199(超级用户),则使用此umask值
fi
…省略部分内容…

[root@localhost ~]# source /etc/profile       //立即在当前shell中生效

你可能感兴趣的:(Linux,服务器,linux,运维)