作用:用于定位一个命令的二进制文件、源文件和手册文件。
语法: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 .....省略
作用:用于查找并显示给定命令/文件的绝对路径,它可能会根据 $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
记住:这个命令的作用就是显示被查找文件/命令的绝对路径。
作用:用于查找符合条件的文档,他会去保存文档的目录名的数据库内查找。
特点:
由于它是基于数据库查询,所以它的查询速度很快,但是它不是实时查询的。
它是模糊查询
需要对文件的目录有 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
作用:通过条件匹配在指定的目录下查找对应文件或目录。匹配的条件可以是文件名称、类型、大小、权限属性、时间戳等。
特点:
精确查找
查找速度较慢
实时查询
语法: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:将找到的文件删除,如果是目录只能删除找到的空目录
当我们在查找某个文件时,如果我们不希望搜索所有的子目录,我们可以指定搜索目录的深度。可以通过 -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
相关选项:
-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
根据文件的属主及属组,我们可以查找符合指定属主、属组的文件,可以使用以下选项来实现:
-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
在 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 .....省略
对于根据文件大小来进行查找,它的语法格式为: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
文件创建时会在元数据中生成访问时间(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 表示后面要跟具体的时间格式
我们可以根据文件的三类访问对象的三种权限来查找对应的文件,命令的语法格式为:
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
我们以查看 /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
修改文件或目录的权限需要使用 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
修改文件或目录的所属者以及所属组的权限的语法为:
# 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
总结:
chmod 命令是用于给文件或目录设置权限,如果是目录,我们需要使用 -R 选项,如果是文件这个选项可以不用指定。使用这个命令我们可以使用 rwx 或者数字来表示权限,还可以通过 u、g、o、a 来表示对那个部分设置权限。
chown 命令是用于给文件或目录修改所属者和所属组权限。如果只修改所属者则使用
chown 新所属者
文件或目录....,如果只修改所属组则使用
chown :新所属组 文件或目录....`。如果我们希望同时给文件或目录修改所属者和所属组,则使用
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
为什么需要有 ACL 权限,原因是我们现在只能对所属者、所属组以及其他用户来进行统一设置。
通过 ACL 可给指定的用户指定的目录分配指定的权限。
对于 ACL 权限来说,它有设置 ACL 权限、查看 ACL 权限和删除 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
查看 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]$
删除 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::---
当所有权限都不能动,但又希望给其他某个人或组设置一定权限时,就可以使用 acl 访问控制列表。
在 Linux 中,用户对文件或目录的访问权限除了 r、w、x 这三种一般权限外,还有 SUID(Set User Id)、SGID(Set Group Id)、Sticky Bit(粘滞位)三种特殊权限,用于对文件或目录进行更加灵活且方便的访问控制。
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
执行流程:
我们来为 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 权限
与 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 这个目录所创建时的所属组
。
这个权限只针对目录有效,对文件无效。对目录的作用是:在具有 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 用户才可以删除,其他用户不能删除。
我们在创建文件或目录时,在 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。
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中生效