文件类型:
- 普通文件(文本文件,二进制文件,压缩文件,电影,图片。。。) d 目录文件(蓝色) b 设备文件 block device 设备文件,如硬盘U盘; c 字符设备文件character,比如我们的终端tty1,打印机。 l symbolic link 即符号链接文件,又称软链接文件 (浅蓝色)
s socket 即套接字文件,用于实现两个进程进行通信 p 管道文件pipe
示例:
[root@rocky-01 ~]# ls -l /run/
total 24
-rw-------. 1 root root 0 Oct 22 10:57 agetty.reload
-rw-r--r--. 1 root root 4 Oct 22 10:57 auditd.pid
drwxr-xr-x. 2 root root 80 Oct 22 11:38 blkid
drwxr-xr-x. 2 root root 40 Oct 22 10:57 console
-rw-r--r--. 1 root root 4 Oct 22 10:57 crond.pid
----------. 1 root root 0 Oct 22 10:57 cron.reboot
drwx------. 2 root root 40 Oct 22 10:57 cryptsetup
drwxr-xr-x. 2 root root 60 Oct 22 10:57 dbus
prw-------. 1 root root 0 Oct 22 10:57 dmeventd-client
prw-------. 1 root root 0 Oct 22 10:57 dmeventd-server
drwxr-xr-x. 2 root root 40 Oct 22 10:57 faillock
drwxr-x---. 2 root root 40 Oct 22 10:57 firewalld
drwxr-xr-x. 2 root root 60 Oct 22 10:57 fsck
prw-------. 1 root root 0 Oct 22 10:57 initctl
drwxr-xr-x. 4 root root 120 Oct 22 10:57 initramfs
drwxr-xr-x. 4 root root 100 Oct 22 10:57 lock
drwxr-xr-x. 3 root root 60 Oct 22 10:57 log
drwx------. 5 root root 140 Oct 22 10:57 lvm
drwxr-xr-x. 2 root root 40 Oct 22 10:57 mount
drwxr-xr-x. 6 root root 160 Oct 22 14:22 NetworkManager
drwxr-xr-x. 2 root root 40 Oct 22 10:57 plymouth
-rw-------. 1 root root 4 Oct 22 10:57 rsyslogd.pid
drwxr-xr-x. 2 root root 40 Oct 22 10:57 sepermit
drwxr-xr-x. 2 root root 40 Oct 22 10:57 setrans
-rw-r--r--. 1 root root 4 Oct 22 10:57 sshd.pid
-rw-------. 1 root root 4 Oct 22 10:57 sssd.pid
文件操作命令
显示当前工作目录
[root@rocky-01 ~]# pwd
/root
[root@rocky-01 ~]# cd /etc/sysconfig/
[root@rocky-01 sysconfig]# pwd
/etc/sysconfig
绝对路径和相对路径
绝对路径
以正斜杠 / 即根目录开始
完整的文件的位置路径
可用于任何想指定一个文件名的时候
相对路径名
不以斜线开始 一般情况下,是指相对于当前工作目录的路径,特殊场景下,是相对于某目录的位置 可以作为一个简短的形式指定一个文件名
基名:basename,只取文件名而不要路径
目录名:dirname,只取路径,不要文件名
[root@rocky-01 sysconfig]# basename /etc/sysconfig/network-scripts/
network-scripts
[root@rocky-01 sysconfig]# dirname /etc/sysconfig/network-scripts/
/etc/sysconfig
目录切换:
切换到上级目录: cd ..
切换到上一次目录: cd -
切换到家目录:cd
[root@rocky-01 sysconfig]# pwd
/etc/sysconfig
[root@rocky-01 sysconfig]# cd .. 上级目录/etc
[root@rocky-01 etc]# cd -
/etc/sysconfig
[root@rocky-01 sysconfig]# cd 家目录/root
[root@rocky-01 ~]# pwd
/root
列出目录信息
ls 命令可以列出目录的内容
命令格式:ls 选项 参数
常见选项:
-a 包含隐藏文件
-l 显示额外的信息
-R 目录递归
-ld 目录和符号链接信息
-1 文件分行显示
-S 按从大到小排序
-t 按mtime排序
-u 配合-t选项,显示并按atime从新到旧排序
-U 按目录存放顺序显示
-X 按文件后缀排序
-F 对不同类型文件显示时附加不同的符号:*/=>@|
-C 文件多时,以多列的方式显示文件,默认是一列(标准输出)
[root@rocky-01 ~]# ls 不指定目录,就默认为当前目录
anaconda-ks.cfg
[root@rocky-01 ~]# ls -a -a:显示,隐藏文件
. .. anaconda-ks.cfg .bash_history .bash_logout .bash_profile .bashrc .cshrc .tcshrc .viminfo
[root@rocky-01 ~]# ls -al
total 40
dr-xr-x---. 2 root root 151 Oct 22 11:30 .
dr-xr-xr-x. 17 root root 224 Sep 24 19:57 ..
-rw-------. 1 root root 1539 Sep 24 20:00 anaconda-ks.cfg
-rw-------. 1 root root 1619 Oct 22 10:56 .bash_history
-rw-r--r--. 1 root root 18 Mar 15 2021 .bash_logout
-rw-r--r--. 1 root root 176 Mar 15 2021 .bash_profile
-rw-r--r--. 1 root root 176 Mar 15 2021 .bashrc
-rw-r--r--. 1 root root 100 Mar 15 2021 .cshrc
-rw-r--r--. 1 root root 129 Mar 15 2021 .tcshrc
-rw-------. 1 root root 10272 Oct 22 11:30 .viminfo
[root@rocky-01 ~]#
查看文件状态stat
时间戳:
Access:访问时间,atime,读取文件内容(进入文件发生改变,echo 导入数据不影响)
Modify:修改时间,mtime,改变文件内容(改变文件数据,不改变内容wq保存退出也会影响)
Change:改变时间,ctime,元数据发生改变(改变数据或权限都会影响)
[root@rocky-01 ~]# stat /etc/passwd
File: /etc/passwd
Size: 1057 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 9057166 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:passwd_file_t:s0
Access: 2022-10-22 09:54:45.074039782 +0800
Modify: 2022-09-24 20:00:14.340203041 +0800
Change: 2022-09-24 20:00:14.340203041 +0800
Birth: 2022-09-24 20:00:14.340203041 +0800
文件通配符:
文件通配符可以用来匹配符合条件的多个文件,方便批量管理文件
通配符采有特定的符号,表示特定的含义,此特符号称为元 meta 字符
常见的通配符如下:
* 匹配零个或多个字符,但不匹配 "." 开头的文件,即隐藏文件
? 匹配任何单个字符,一个汉字也算一个字符
~ 当前用户家目录
~mage 用户mage家目录
[0-9] 匹配数字范围
[a-z] 一个字母
[A-Z] 一个字母
[wang] 匹配列表中的任何的一个字符
[^wang] 匹配列表中的所有字符以外的字符
[^a-z] 匹配列表中的所有字符以外的字符
. 和 ~+ 当前工作目录
~- 前一个工作目录
{ } 产生一个序列,以逗号分隔,且不能有空格
$ 以什么结尾
^ 以什么开头
[:digit:]:任意数字,相当于0-9
[:lower:]:任意小写字母,表示 a-z
[:upper:]: 任意大写字母,表示 A-Z
[:alpha:]: 任意大小写字母
[:alnum:]:任意数字或字母
[:blank:]:水平空白字符
[:space:]:水平或垂直空白字符
[:punct:]:标点符号
[:print:]:可打印字符
[:cntrl:]:控制(非打印)字符
[:graph:]:图形字符
[:xdigit:]:十六进制字符
创建空文件和刷新时间
touch:用来创建空文件或刷新文件时间
格式:touch 选项 参数(文件名)
选项说明:
-a : 仅改变atime和ctime
-m : 仅改变mtime和ctime
-t :[[CC]YY]MMDDhhmm[.ss] 指定atime和mtime的时间戳 (CC 为年数中的前两位,YY为年数的后两位,MM为月份,DD为天数,hh小时数,mm分钟数,SS为秒数0-61)
-c : 如果文件不存在,则不予创建
[root@rocky-01 ~]# stat a.txt
File: a.txt
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 16797829 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2022-10-22 21:47:27.370735684 +0800
Modify: 2022-10-22 21:47:27.370735684 +0800
Change: 2022-10-22 21:47:27.370735684 +0800
Birth: 2022-10-22 21:46:36.964734601 +0800
[root@rocky-01 ~]# touch -a a.txt
[root@rocky-01 ~]# stat a.txt
File: a.txt
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 16797829 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2022-10-22 22:05:23.105758811 +0800
Modify: 2022-10-22 21:47:27.370735684 +0800
Change: 2022-10-22 22:05:23.105758811 +0800
Birth: 2022-10-22 21:46:36.964734601 +0800
[root@rocky-01 ~]# touch -m a.txt
[root@rocky-01 ~]# stat a.txt
File: a.txt
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 16797829 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2022-10-22 22:05:23.105758811 +0800
Modify: 2022-10-22 22:05:39.000759153 +0800
Change: 2022-10-22 22:05:39.000759153 +0800
Birth: 2022-10-22 21:46:36.964734601 +0800
[root@rocky-01 ~]# touch -c a.txt
[root@rocky-01 ~]# stat a.txt
File: a.txt
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 16797829 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2022-10-22 22:05:50.733759405 +0800
Modify: 2022-10-22 22:05:50.733759405 +0800
Change: 2022-10-22 22:05:50.733759405 +0800
Birth: 2022-10-22 21:46:36.964734601 +0800
[root@rocky-01 ~]# touch -t 202210222008.00 a.txt
[root@rocky-01 ~]# stat a.txt
File: a.txt
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 16797829 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2022-10-22 20:08:00.000000000 +0800
Modify: 2022-10-22 20:08:00.000000000 +0800
Change: 2022-10-22 22:08:36.626762972 +0800
Birth: 2022-10-22 21:46:36.964734601 +0800
复制文件和目录
命令:copy 复制文件和目录。
cp 命令主要用于复制文件或目录。即用来将一个或多个源文件或者目录复制到指定的目的文件或目录。
cp 命令可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下。
cp 命令支持同时复制多个文件,当一次复制多个文件时,目标文件参数必须是一个已经存在的目录,否则将出现错误
格式:cp [选项] source_file dest_file
常用选项:
-a :等于 “dpR” 参数组合,通常在复制目录时保留链接、文件属性,并复制目录下的所有内容。
-b:目标存在,覆盖前,先备份,默认形式为filename~,只保留最近的备份
-d :不复制原文件,只复制链接名
-f :强行复制文件或目录,覆盖已经存在的目标文件而不给出提示。
-i :与-f选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖。
-l :不复制文件,只是生成源文件的硬链接文件。
-p :复制文件时保留源文件或目录的属性。
-r :递归复制目录,即复制该目录及其所有的子目录和文件。
-R :同 -r 选项参数。
-s:对源文件建立符号连接,而非复制文件;
-S:在备份文件时,用指定的后缀“SUFFIX”代替文件的默认后缀;
-u:同步复制源文件文件,只复制源文件比目标更新文件或目标不存在的文件。
-v:详细显示命令执行的操作。
移动和重命名文件
mv 移动文件或改名
如果目标文件是文件夹,则源文件直接移动到该文件夹内,名字还是源文件的名字
如果目标文件时文件,则源文件移动的同时也会更改名字
如果源文件为多个,则目标必须是目录,并且统一移动到目录下
格式: mv 选项 参数
-b:当目标文件存在是,先进性备份再覆盖
-f: 当目标文件存在是,强制覆盖
-i:默认选项,当目标文件存在时,提示是否覆盖
-v:显示过程
[root@rocky-01 ~]# mv -b a.txt /tmp/
mv: overwrite '/tmp/a.txt'? y
[root@rocky-01 ~]# ls /tmp/
a.txt a.txt~ c.txt ~为备份文件
[root@rocky-01 ~]# mv -f a.txt /tmp/
[root@rocky-01 ~]#
[root@rocky-01 ~]# touch c.txt
[root@rocky-01 ~]# mv -i c.txt /tmp/
mv: overwrite '/tmp/c.txt'? y
[root@rocky-01 ~]# ls /tmp/
a.txt a.txt~ c.txt 只提示,不备份
删除文件(重点)
rm 删除文件和目录
格式:rm [选项] file
常用选项:
-i 交互式,删除前会询问是否执行(默认加了)
-f 强制删除
-r 递归删除,常用于目录的删除,高危操作,谨慎!!!
[root@rocky-01 ~]# touch {b..e}.txt
[root@rocky-01 ~]# ls
anaconda-ks.cfg a.txt b.txt c.txt d.txt e.txt
[root@rocky-01 ~]# rm a.txt
rm: remove regular empty file 'a.txt'? y
[root@rocky-01 ~]# ls
anaconda-ks.cfg b.txt c.txt d.txt e.txt
[root@rocky-01 ~]# rm b.txt c.txt
rm: remove regular empty file 'b.txt'? y
rm: remove regular empty file 'c.txt'? y
[root@rocky-01 ~]# rm -f d.txt
[root@rocky-01 ~]#
[root@rocky-01 ~]# mkdir -p a/b/c/d
[root@rocky-01 ~]# rm a
rm: cannot remove 'a': Is a directory
[root@rocky-01 ~]# rm -r a
rm: descend into directory 'a'? y
rm: descend into directory 'a/b'? y
rm: descend into directory 'a/b/c'? y
rm: remove directory 'a/b/c/d'? y
rm: remove directory 'a/b/c'? y
rm: remove directory 'a/b'? y
rm: remove directory 'a'? y
........
[root@rocky-01 ~]# ls
a anaconda-ks.cfg e.txt
[root@rocky-01 ~]# rm -rf a 强制递归删除目录,不用每次都确认(非常危险操作)
[root@rocky-01 ~]#
删除特殊字符:例如以 - 开头的文件
[root@rocky-01 ~]# touch -- -file
[root@rocky-01 ~]# ls
anaconda-ks.cfg e.txt -file
[root@rocky-01 ~]# rm -file
rm: invalid option -- 'l'
Try 'rm ./-file' to remove the file '-file'.
Try 'rm --help' for more information.
[root@rocky-01 ~]# rm -- -file
rm: remove regular empty file '-file'? y
[root@rocky-01 ~]# ls
anaconda-ks.cfg e.txt
或者
[root@rocky-01 ~]# touch ./-file
[root@rocky-01 ~]# ls
anaconda-ks.cfg e.txt -file
[root@rocky-01 ~]# rm -file
rm: invalid option -- 'l'
Try 'rm ./-file' to remove the file '-file'.
Try 'rm --help' for more information.
[root@rocky-01 ~]# rm ./file
rm: cannot remove './file': No such file or directory
[root@rocky-01 ~]# rm ./-file
rm: remove regular empty file './-file'? y
[root@rocky-01 ~]#
因为一般“-”后面接的是选项。因此,单纯地使用rm -file
,系统的命令就会误判。所以,只能用避过首字符“-”的方式(加上本目录 ./)
显示目录树:tree
格式:tree 选项 文件
-d:只显示目录
-L level :指定显示的层级数目
-p : 显示结构同时显示文件权限
[root@rocky-01 ~]# tree a
a
└── b
├── 1.txt
└── c
├── 2.txt
└── d
├── 3.txt
└── e
4 directories, 3 files
[root@rocky-01 ~]# tree -d a
a
└── b
└── c
└── d
└── e
4 directories
[root@rocky-01 ~]# tree -L 3 a
a
└── b
├── 1.txt
└── c
├── 2.txt
└── d
3 directories, 2 files
[root@rocky-01 ~]# tree -p a
a
└── [drwxr-xr-x] b
├── [-rw-r--r--] 1.txt
└── [drwxr-xr-x] c
├── [-rw-r--r--] 2.txt
└── [drwxr-xr-x] d
├── [-rw-r--r--] 3.txt
└── [drwxr-xr-x] e
4 directories, 3 files
创建目录:mkdir
格式:mkdir 选项 目录文件(一个或多个)
-m:设置文件权限
-p:递归创建多级目录,如果目录已存在,不会报错
-v:显示创建过程
[root@rocky-01 date]# mkdir dir1
[root@rocky-01 date]# mkdir dir2/dir3/dir4
mkdir: cannot create directory ‘dir2/dir3/dir4’: No such file or directory
[root@rocky-01 date]# mkdir -pv dir2/dir3/dir4
mkdir: created directory 'dir2'
mkdir: created directory 'dir2/dir3'
mkdir: created directory 'dir2/dir3/dir4'
[root@rocky-01 date]#
.......
[root@rocky-01 date]# mkdir -m=4777 dir5 #-m 指定权限
[root@rocky-01 date]# ls -l
total 0
drwxr-xr-x. 2 root root 6 Oct 23 00:41 dir1
drwxr-xr-x. 3 root root 18 Oct 23 00:42 dir2
drwsrwxrwx. 2 root root 6 Oct 23 00:45 dir5
删除空目录:rmdir
常见选项:
-p 递归删除父空目录,删除指定目录及其上级文件夹
-v 显示详细信息
注意:rmdir只能删除空目录,如果想删除非空目录,可以使用rm -r 命令,递归删除目录树
[root@rocky-01 date]# mkdir -p a/b/c/
[root@rocky-01 date]# tree a
a
└── b
└── c
2 directories, 0 files
[root@rocky-01 date]# rmdir a
rmdir: failed to remove 'a': Directory not empty #删除非空目录报错
[root@rocky-01 date]# rmdir -p a/b/c 递归删除
[root@rocky-01 date]# mkdir -p a/b/c/
[root@rocky-01 date]# rmdir -pv a/b/c 递归删除过程
rmdir: removing directory, 'a/b/c'
rmdir: removing directory, 'a/b'
rmdir: removing directory, 'a'
文本内容查看命令
查看文本文件内容:cat
格式:cat 选项 文件file
常见选项:
-E:显示行结束符$
-A:显示所有控制符
-n:对显示出的每一行进行编号
-b:非空行编号
-s:压缩连续的空行成一行
[root@rocky-01 date]# cat a.txt
a b d
c b
d
d
[root@rocky-01 date]# cat -A a.txt
a b d$
c^Ib$
$
d$
$
$
d$
$
[root@rocky-01 date]# cat -E a.txt
a b d$
c b$
$
d$
$
$
d$
$
[root@rocky-01 date]# cat -n a.txt
1 a b d
2 c b
3
4 d
5
6
7 d
8
[root@rocky-01 date]# cat -b a.txt
1 a b d
2 c b
3 d
4 d
[root@rocky-01 date]# cat -bs a.txt
1 a b d
2 c b
3 d
4 d
[root@rocky-01 date]# hexdump -C a.txt
00000000 61 20 20 62 20 20 64 0a 63 09 62 0a 0a 64 0a 0a |a b d.c.b..d..|
00000010 0a 64 0a 0a |.d..|
00000014
分页查看文件内容:more;less;head;tail
more 命令:可以实现分页查看文件,配合管道符实现输出信息的分页
快捷键:
空格键 :显示手册页的下一幕
Enter:一次滚动手册页的一行
b:回滚一屏
f:前滚一屏
q:退出
/word:搜索word字符串
[root@rocky-01 ~]# ll /etc/ |more -10
total 1048
-rw-r--r--. 1 root root 16 Sep 24 20:00 adjtime
-rw-r--r--. 1 root root 1529 Mar 15 2021 aliases
drwxr-xr-x. 2 root root 103 Sep 24 19:58 alternatives
-rw-r--r--. 1 root root 541 Apr 20 2022 anacrontab
drwxr-x---. 4 root root 100 Sep 24 20:12 audit
drwxr-xr-x. 3 root root 46 Sep 24 19:59 authselect
drwxr-xr-x. 2 root root 55 Sep 24 19:58 bash_completion.d
-rw-r--r--. 1 root root 3019 Mar 15 2021 bashrc
-rw-r--r--. 1 root root 535 Apr 20 2022 bindresvport.blacklist
--More--
每页显示10个文件信息
less 命令:也可以实现分页查看文件或STDIN输出,less 命令是man命令使用的分页器
格式:less 选项 文件
常用选项:
-e:当文件显示结束后,自动离开
-i:忽略搜索时的大小写
-m:显示类似more命令的百分比
-N:显示每行的行号
-s:显示连续空行为一行
常用操作快捷键
/字符串:向下搜索 字符串 的功能
?字符串:向上搜索 字符串 的功能
n:重复前一个搜索(与 / 或 ?有关)
N:反向重复前一个搜索
b:向前翻一页
d:向后翻一页
q:退出
空格键:向后翻一页
向上键:向上翻动一行
向下键:向下翻动一行
head 命令:可以显示文件或标准输入的前面行
格式:head 选项 文件
常用选项:
-c # :指定获取前#字节
-n # :指定获取前#行,如果#为减数,表示从文件头取值到倒数第#前
-:指定获取前多少行
[root@rocky-01 ~]# head -c4 /etc/passwd
root[root@rocky-01 ~]# head -n 3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@rocky-01 ~]# head -3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@rocky-01 ~]# head -n -3 /etc/passwd #倒数三行不要,取倒数三行前的行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
systemd-resolve:x:193:193:systemd Resolver:/:/sbin/nologin
tss:x:59:59:Account used for TPM access:/dev/null:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
unbound:x:997:994:Unbound DNS resolver:/etc/unbound:/sbin/nologin
[root@rocky-01 ~]#
tail命令:tail和head相反,查看文件或标准输入的倒数行
格式:tail 选项 文件
常用选项:
-c #:指定获取后#字节
-n #:指定获取后#行,如果#是加数,表示从第#行开始到文件结束取值
-:指定获取后几行
-f:跟踪显示文件fd新追加的内容,常用日志监控,相当于 --follow=descriptor,当文件删除再新 建同名文件,将无法继续跟踪文件
[root@rocky-01 ~]# cat a.txt
1
2
3
4
5
6
7
8
9
10
[root@rocky-01 ~]# tail -3 a.txt
8
9
10
[root@rocky-01 ~]# tail -n 3 a.txt
8
9
10
[root@rocky-01 ~]# tail -n +3 a.txt
3
4
5
6
7
8
9
10
按列抽取文本:cut
cut命令:可以提取文本文件或STDIN数据的指定列
格式:cut 选项 文件
常用选项:
-d:指定分隔符,默认为tab
-f:
#:第#个字段,例如:3
[#,#]:离散的多个字段,例如1,3,5
#-#:连续的多个字段,例如:1-6
-c:按字符切割
--output-delimiter=SETING 指定输出分隔符
[root@rocky-01 ~]# cat a.txt
a:b:c:d:e:f:g
[root@rocky-01 ~]# cut -d: -f1,3-5,7 a.txt
a:c:d:e:g
[root@rocky-01 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.10.128 netmask 255.255.255.0 broadcast 192.168.10.255
inet6 fe80::20c:29ff:fe15:1eb8 prefixlen 64 scopeid 0x20<link>
。。。。。。。。。。。忽略。。。。。。。。。。。。。。。
[root@rocky-01 ~]# ifconfig | head -n2 | tail -n1 | tr -s " " |cut -d " " -f3
192.168.10.128
tr -s " " 把多个空格压缩成一个
[root@rocky-01 ~]# cut -d: -f1,4,7 --output-delimiter="###" a.txt
a###d###g
收集文本统计数据:wc
wc命令:可用于统计文件的总行数,单词总数,字节总数和字符总数
格式:wc 选项 文件
-l:总行数
-w:单词总数
-c:字节总数
-m:字符总数
-L:显示我呢见中最长行的长度
[root@rocky-01 ~]# wc /etc/passwd 默认值已经包含-lwc
22 41 1057 /etc/passwd
[root@rocky-01 ~]# wc -l /etc/passwd
22 /etc/passwd
[root@rocky-01 ~]# wc -w /etc/passwd
41 /etc/passwd
[root@rocky-01 ~]# wc -c /etc/passwd
1057 /etc/passwd
文件排序:sort
sort命令:把整理过的文本显示在终端,不改变原始文件数据
格式:sort 选项 文件
常用选项:
-r:执行反方向(由下向上)整理
-R:随机排序
-n:按数字大小排序
-f:忽略字符串中的字符大小写
-u:合并重复项,去重
-t :c 选项使用c做为字段界定符
-k :# 选项按照使用c字符分隔的 # 列来整理能够使用多次
去重:uniq
uniq命令:从输入中删除前后相接的重复项
格式:uniq 选项 文件
常见选项:
-c:显示每行重复出现的次数
-d:仅显示重复过的行
-u:仅显示不曾重复的行
uniq搭配sort一起使用,先排序,后去重
文本比较:diff
diff命令:比较两个文件之间的区别
-u 选项来输出“统一的(unified)”diff格式文件,最适用于补丁文件
[root@rocky-01 ~]# cat c.txt
zhang
san
li
wang
ma
[root@rocky-01 ~]# cat d.txt
zhang
wang
mage
linuxprobe
[root@rocky-01 ~]# diff -u c.txt d.txt
--- c.txt 2022-10-23 12:21:34.830801351 +0800
+++ d.txt 2022-10-23 12:21:59.931801913 +0800
@@ -1,6 +1,5 @@
zhang
-san
-li
wang
-ma
+mage
+linuxprobe
用户
linux中每个用户是通过UID来唯一标识
[root@VM-12-5-tlinux ~]# id root
uid=0(root) gid=0(root) 组=0(root)
[root@VM-12-5-tlinux ~]# id andy
uid=1001(andy) gid=1001(andy) 组=1001(andy)
系统用户UID:1-999
普通用户UID:1000+
用户组:
linux中可以将一个或多个用户加入用户组中,用户组是通过GID来唯一标识
[root@VM-12-5-tlinux ~]# getent group
root:x:0:
.......
mysql:x:1007:
www:x:1008:
linuxprobe:x:1009:
系统组:1-999
普通用户组:1000+
用户和用户组:
主要组:用户必须属于一个且只有一个主组,默认创建用户是会自动创建和用户同名的组,做为用户的主要组
附加组:一个用户可以属于零个或者多个辅助组,附属组
[root@VM-12-5-tlinux ~]# id haha
uid=1011(haha) gid=1011(haha) 组=1011(haha),1009(linuxprobe)
用户和组的配置文件
/etc/passwd:用户及其属性信息(名称、UID、主组ID等)
/etc/shadow:用户密码及其相关属性
/etc/group:组及其属性信息
/etc/gshadow:组密码及其相关属性
passwd文件格式:
[root@VM-12-5-tlinux ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/
第一段:root:login name登录用户
第二段:x:passwd 密码
第三段:0:UID 用户身份编号
第四段:0:GID 用户组编号
第五段:root:用户全名或注释
第六段:/root:用户主目录
第七段:/bin/bash:用户默认使用的shell
shadow文件格式:
[root@VM-12-5-tlinux ~]# cat /etc/shadow
root:$6$06LPApz8$67EcreQqkWU9goys.6cxuA2o6F3g.eP8ouVhPSkCFaIxY3WNrPFgoqvz/PgNrQCjZfz7KyxKE7Ooj9Ur89n3h.:19268:0:99999:7:::
第一段:root:登录用户
第二段:(sha512加密):用户密码
第三段:19268:从1970年1月1日1起到密码最近被更改时间
第四段:0:密码再过几天可以被变更(0表示随时可以变更)
第五段:99999:密码再过几天必须被变更(99999表示永不过期)
第六段:7:密码过去前几天系统提醒用户(默认一周)
第七段::密码过期几天后账号会被锁定
第八段:: 从1970年月1日算起,多少天后账号失效
更改密码加密算法:
[root@VM-12-5-tlinux ~]# authconfig --passalgo=sha256 --update
密码的安全策略:
足够长
使用数字,大小写字母以及特殊字符至少三种
使用随机密码
定期更换
随机生成密码:
[root@VM-12-5-tlinux ~]# mkpasswd -l 10 -c 2 -C 3 -d 4 -s 1
O,8346uJWs
-l 密码长度;-c 小写字母个数;-C 大写字母个数;-d 数字个数;-s 特殊字符个数
linux 8种随机生成密码参考文档:http://www.wjhsh.net/dadonggg-p-8477655.html
group文件格式:
[root@VM-12-5-tlinux ~]# cat /etc/group
root:x:0:
bin:x:1:
[root@VM-12-5-tlinux ~]# getent group
root:x:0:
bin:x:1:
daemon:x:2:
第一段:root:群组名称
第二段:x:群组密码(通常不需要设定,密码是被记录在/etc/gshadow)
第三段:0:群组ID
第四段::以当前组为附加组的用户列表
gshadow文件格式:
[root@VM-12-5-tlinux ~]# getent gshadow
root:::
bin:::
daemon:::
[root@VM-12-5-tlinux ~]# cat /etc/gshadow
root:::
bin:::
daemon:::
群组名称:就是群的名称
群组密码:
组管理员列表:组管理员的列表,更改组密码和成员
以当前组为附加组的用户列表:多个用户间用逗号分隔
命令扩展:
pwck命令功能:检查用户密码文件的完整性(/etc/passwd以及/etc/shadow文件)。 grpck命令功能:检查用户组及密码文件的完整性(etc/group以及/etc/gshadow文件)
vipw 编辑密码文件,并且上锁,其他人无法修改 vipw 会打开/etc/passwd文件,可以对其进行编辑 vipw -s :修改/etc/shadow文件
vigr 编辑用户组文件 ,并且上锁,其他人无法修改 vigr 修改/etc/groups文件 vigr -s 修改/etc/gshadow文件
用户和组管理命令:
useradd :创建用户
usermod:修改用户
userdel:删除用户
groupadd:创建组
groupmod:修改组属性
groupdel:删除组
创建用户useradd
格式:useradd [选项] [用户名]
-u:指定UID;
-g:指定主组;
-c:用户的注释信息;
-d:指定家目录;
-s:指定用户默认的shell;
-G:指定用户附加组;
-r:创建系统用户;
-M:不创建家目录,用于非系统用户;
-p:指定加密的密码;
-m:创建家目录,用于系统用户;
-D:变更用户预设值
[root@VM-12-5-tlinux ~]# useradd -r -u 48 -s /sbin/nologin -d /var/www -c "Apache" apache
[root@VM-12-5-tlinux ~]# useradd jin -s /sbin/nologin
[root@VM-12-5-tlinux ~]# tail -2 /etc/passwd
apache:x:48:48:Apache:/var/www:/sbin/nologin
jin:x:1011:1011::/home/jin:/sbin/nologin
useradd 命令默认值设定由/etc/default/useradd定义
[root@VM-12-5-tlinux ~]#cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1 #对应/etc/shadow文件第7列,即用户密码过期后的帐号锁定的宽限期,-1表示不锁定
EXPIRE= #对应/etc/shadow文件第8列,即用户帐号的有效期
SHELL=/bin/bash
SKEL=/etc/skel #用于生成新建用户家目录的模版文件
CREATE_MAIL_SPOOL=yes
新建用户的相关文件
[root@VM-12-5-tlinux ~]# cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
[root@VM-12-5-tlinux ~]# cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
[root@VM-12-5-tlinux ~]# cat /etc/login.defs | grep -v ^# |grep -v ^$
MAIL_DIR /var/spool/mail
PASS_MAX_DAYS 90
PASS_MIN_DAYS 0
PASS_MIN_LEN 9
PASS_WARN_AGE 7
UID_MIN 1000
UID_MAX 60000
SYS_UID_MIN 201
SYS_UID_MAX 999
GID_MIN 1000
GID_MAX 60000
SYS_GID_MIN 201
SYS_GID_MAX 999
CREATE_HOME yes
UMASK 077
USERGROUPS_ENAB yes
ENCRYPT_METHOD SHA512
MD5_CRYPT_ENAB no
批量创建用户:
[root@VM-12-5-tlinux ~]# cat user.txt
user01:x:1012:1012::/home/user01:/bin/bash
user02:x:1013:1013::/home/user02:/bin/bash
user03:x:1014:1014::/home/user03:/bin/bash
user04:x:1015:1015::/home/user04:/bin/bash
user05:x:1016:1016::/home/user05:/bin/bash
[root@VM-12-5-tlinux ~]# cat passwd.txt
user01:admin123
user02:admin123
user03:admin123
user04:admin123
user05:admin
[root@VM-12-5-tlinux ~]# newusers user.txt
[root@VM-12-5-tlinux ~]# pwunconv
[root@VM-12-5-tlinux ~]# chpasswd passwd.txt
[root@VM-12-5-tlinux ~]# pwconv
[root@VM-12-5-tlinux ~]# tail -5 /etc/passwd
user01:x:1012:1012::/home/user01:/bin/bash
user02:x:1013:1013::/home/user02:/bin/bash
user03:x:1014:1014::/home/user03:/bin/bash
user04:x:1015:1015::/home/user04:/bin/bash
user05:x:1016:1016::/home/user05:/bin/bash
[root@VM-12-5-tlinux ~]# cp -a /etc/skel/. /home/user01
....
删除用户:userdel
userdel命令:可以删除Linux用户
userdel 选项 用户
-r:删除用户家目录和邮箱
-f:强制删除(运行中的用户无法删除,用强制删除可以)
用户属性修改:usermod
格式:usermod 选项 用户
常用选项:
-u UID: 新UID
-g GID: 新主组
-G GROUP1[,GROUP2,...[,GROUPN]]]:新附加组,原来的附加组将会被覆盖;若保留原有,则要同时使
用-a选项
-s SHELL:新的默认SHELL
-c 'COMMENT':新的注释信息
-d HOME: 新家目录不会自动创建;若要创建新家目录并移动原家数据,同时使用-m选项
-l login_name: 新的名字
-L: lock指定用户,在/etc/shadow 密码栏的增加 !
-U: unlock指定用户,将 /etc/shadow 密码栏的 ! 拿掉
-e YYYY-MM-DD: 指明用户账号过期日期
-f INACTIVE: 设定非活动期限,即宽限期
查看用户相关的ID信息:id
命令格式:id 选项 用户
常见选项:
-u:显示UID
-g:显示GID
-G:显示用户所属的组ID
-n:显示名称,需配合ugG使用
[root@rocky-01 ~]# id linuxprobe
uid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe)
[root@rocky-01 ~]# id -u linuxprobe
1000
[root@rocky-01 ~]# id -g linuxprobe
1000
[root@rocky-01 ~]# id -G linuxprobe
1000
[root@rocky-01 ~]# id -nG linuxprobe
linuxprobe
切换用户或以其它用户身份执行命令:su
su命令:切换身份,并且已指定的身份执行命令
命令格式:su 选项 用户
常用选项:
-l , -login 加了这个参数类似重新登录,等同于 su - username,工作目录会改变,如果没有指定用户,缺省为root
-c,command:变更账号为user的使用者,并执行命令后再变回原来使用者:su - username -c command
切换用户的方式:
su username:非登录式切换,不会读取目标用户的配置文件,不改变当前工作目录,不完全切换
su - username:登录式切花,会读取目标用户的配置文件,切换至自己的家目录,完全切换
root 切换至其他用户无需密码;非root用户切换时需要密码
注意:su 切换新用户后,使用 exit 退回至旧的用户身份,而不要再用 su 切换至旧用户,否则会生成很 多的bash子进程,环境可能会混乱。
设置用户密码:
passwd 选项 用户
-d:删除指定用户密码
-l:锁定指定用户
-u:解锁指定用户
-e:强制用户下次登录修改密码
-f:强制操作
-n mindays:指定最短使用期限
-x maxdays:最大使用期限
-w warndays:提前多少天开始警告
-i inactivedays:非活动期限
--stdin:从标准输入接收用户密码,Ubuntu无此选项
非交互式修改用户密码
[root@VM-12-5-tlinux ~]# echo 'Dis@init3' | passwd --stdin user03
更改用户 user03 的密码 。
passwd:所有的身份验证令牌已经成功更新
#生成随机密码
[root@VM-12-5-tlinux ~]# yum install -y expect
修改用户密码策略:chage
chage:修改账号和密码的有效期限
格式:chage 选项 用户
常见选项:
-d:指定密码最后修改日期
-E:密码到期的日期,过了这天,此账号将不可用。0表示马上过期,-1表示永不过期
-h:显示帮助信息并退出
-I(大写字母i):密码过期后,锁定账号的宽限期
-l (小写字母l):列出用户以及密码的有效期
-m:密码可以更改的最小天数。为零代表任何时候都可以更改密码
-M:密码保持有效的最大天数
-W:密码过期前,提前收到告警信息的天数
创建组:groupadd
格式:groupadd 选项 组名
常见选项:
-g GID:指定GID
-r:创建系统组
修改组属性:groupmod
格式:groupadd 选项 组名
常见选项:
-n group_name:改新名字
-g GID:新GID
删除组:groupdel
格式:groupdel 选项 组名
常见选项:
-f:强制删除,即使时用户的主组也强制删除,但会导致无主组的用户不可用无法登录
更改组成员和密码:gpasswd
格式:gpasswd 选项 组名
常见选项:
-a user :将user添加至指定组中
-d user: 从指定附加组中移除用户user
-A user1,user2,... :设置有管理权限的用户列表
更改和查看组成员:groupmems
管理附加组和成员关系
格式:groupmems 选项 组或用户...
常见选项:
-g:更改为指定组
-a:指定用户加入组
-d:从组中删除用户
-p:从组中清除所有成员
-l:显示组成员列表
文件权限管理
程序访问文件时的权限,取决于此程序的发起者
-
进程的发起者,同文件的属主:则应用文件属主权限
-
进程的发起者,属于文件属组;则应用文件属组权限
-
应用文件“其它”权限
文件所有者和属组属性操作
设置文件的所有者:chown
chown命令:可以修改文件的属主,也可以修改文件属组
格式:
chown 选项 所有者 所属组 文件
chown 选项 --reference=RFILE 文件
常用选项用法:
OWNER #只修改所有者
OWNER:GROUP #同时修改所有者和属组
:GROUP #只修改属组,冒号也可用 . 替换
--reference=RFILE #参考指定的的属性,来修改
-R #递归,此选项慎用,非常危险!
文件权限说明:
owner: 属主,u
group: 属组,g
other:其他,o
权限:每个文件针对每类访问者都定义了三种权限
r Readable 4
w Writable 2
x eXcutable 1
对文件的权限
r 可使用文件查看类工具,比如:cat,可以获取其内容
w 可修改其内容,文件的是否被删除和文件的权限无关
x 可以把此文件提请内核启动为一个进程,即可以执行(运行)此文件(此文件的内容必须是可执行)
文件权限常见组合
--- 0
r 4
r-x 5
rw 6
rwx 7
对目录的权限
r 可以使用ls查看此目录中文件名列表,但无法看到文件的属性meta信息,包括inode号,不能查看文件的
内容
w 可在此目录中创建文件,也可删除此目录中的文件,而和此被删除的文件的权限无关
x 可以cd进入此目录,可以使用ls -l file或stat file 查看此目录中指定文件的元数据,当预先知
道文件名称时,也可以查看文件的内容,属于目录的可访问的最小权限
X 分配给目录或有部分x权限的文件的x权限,对无任意x权限的文件则不会分配x权限
目录权限常见组合
- 不能访问目录
r-x 只读目录
rwx 可读也可写目录
修改文件权限:chmod
chmod命令:修改某个目录或文件的访问权限
格式:chmod [-cfvR] [--help] [--version] [who] [+ | - | =] [mode] 文件名
[root@rocky-01 ~]# chmod -R u+r /date/linux/
u User,即文件或目录的拥有者;
g Group,即文件或目录的所属群组;
o Other,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围;
a All,即全部的用户,包含拥有者,所属群组以及其他用户;
r 读取权限,数字代号为“4”;
w 写入权限,数字代号为“2”;
x 执行或切换权限,数字代号为“1”;
- 不具任何权限,数字代号为“0”;
s 特殊功能说明:变更文件或目录的权限
选项:
-c : 若该档案权限确实已经更改,才显示其更改动作
-f : 若该档案权限无法被更改也不要显示错误讯息
-v : 显示权限变更的详细资料
-R : 对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更)
操作对象who可是下述字母中的任一个或者它们的组合:
u 表示“用户(user)”,即文件或目录的所有者。
g 表示“同组(group)用户”,即与文件属主有相同组ID的所有用户。
o 表示“其他(others)用户”。
a 表示“所有(all)用户”。它是系统默认值。
操作符号可以是:
+ 添加某个权限。
- 取消某个权限。
= 赋予给定权限并取消其他所有权限(如果有的话)。
设置 mode 所表示的权限可用下述字母的任意组合:
r 可读。
w 可写。
x 可执行。
X 只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x 属性。
s 在文件执行时把进程的属主或组ID置为该文件的文件属主。
特殊权限:SUID,SGID,STICKY
SUID:仅作用于二进制可执行文件上,用户将继承此程序所有者的权限
权限设定:
chmod u+s file1
chmod 4xxx file1 #suid=4
chmod u-s
[root@rocky-01 linux]# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 33424 Apr 20 2022 /usr/bin/passwd
SGID:作用于二进制可执行文件上,用户将继承此程序的所有组权限;
二进制的可执行文件上SGID权限功能:
-
任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
-
启动为进程之后,其进程的属组为原程序文件的属组
SGID权限设定
chmod g+s file
chmod 2xxx file
chmod g-s file
作用目录上,此目录中新建的文件的所属组将自动从此目录继承
默认情况下,用户创建文件时,其属组为此用户所属的主组,一旦某目录被设定了SGID,则对此目录有 写权限的用户在此目录中创建的文件所属的组为此目录的属组,通常用于创建一个协作目录
SGID权限设定
chmod g+s 目录
chmod 2xxx 目录
chmod g-s 目录
STICKY:作用于目录上,此目录中的文件只能由所有者自己或root来删除
权限设定:
chmod o+t 目录
chmod 1xxx 目录
chmod o-t 目录
权限位映射
SUID: user,占据属主的执行权限位
s:属主拥有x权限
S:属主没有x权限
SGID: group,占据属组的执行权限位
s: group拥有x权限
S:group没有x权限
Sticky: other,占据other的执行权限位
t:other拥有x权限
T:other没有x权限
设定文件特殊属性:chattr,lsattr
chattr命令:用来修改文件或目录的隐藏属性
格式:chattr [+-=] [选项] 文件或目录名
选项:
i: 如果对文件设置 i 属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;
如果对目录设置 i 属性,那么只能修改目录下文件中的数据,但不允许建立和删除文件;
a:如果对文件设置 a 属性,那么只能在文件中増加数据,但是不能删除和修改数据; 如果对目录设置 a 属性,那么只允许在目录中建立和修改文件,但是不允许删除文件;
u: 设置此属性的文件或目录,在删除时,其内容会被保存,以保证后期能够恢复,常用来防止意外删除文件或目录。
s:和 u 相反,删除文件或目录时,会被彻底删除(直接从硬盘上删除,然后用 0 填充所占用的区域),不可恢复。
文件赋予i属性测试:
[root@rocky-01 date]# ls
a.txt linux
[root@rocky-01 date]# chattr +i a.txt
[root@rocky-01 date]# lsattr a.txt
----i--------------- a.txt
[root@rocky-01 date]# rm -rf a.txt
rm: cannot remove 'a.txt': Operation not permitted
[root@rocky-01 date]# echo 111 > a.txt
bash: a.txt: Operation not permitted
[root@rocky-01 date]# echo 111 >> a.txt
bash: a.txt: Operation not permitted
[root@rocky-01 date]# chattr -i a.txt
[root@rocky-01 date]# lsattr a.txt
-------------------- a.txt
[root@rocky-01 date]# rm -rf a.txt
[root@rocky-01 date]# ls
linux
----------------------------------------------------------
目录赋予i 属性测试:
[root@rocky-01 date]# touch linux/b.txt
[root@rocky-01 date]# ll linux/
total 0
-rw-r--r--. 1 root root 0 Oct 23 20:20 b.txt
[root@rocky-01 date]# chattr +i linux/
[root@rocky-01 /]# lsattr date/
----i--------------- date/linux
[root@rocky-01 linux]# touch c.txt
touch: setting times of 'c.txt': No such file or directory
[root@rocky-01 linux]# echo 123 > b.txt
[root@rocky-01 linux]# cat b.txt
123
[root@rocky-01 linux]# rm -rf b.txt
rm: cannot remove 'b.txt': Operation not permitted
[root@rocky-01 linux]#
一旦给目录设置i属性,即使时root用户,也无法在目录内部新建或删除文件,但可以修改文件内容
访问控制列表ACL
setfacl命令:可设置ACL权限
getfacl命令:可查看设置的ACL权限
-m:设定ACL权限,u:用户名:权限,g:组名:权限
-x:删除指定用户或群组的ACL权限,setfacl -x u:用户 文件
-b:删除指定文件有关的所有ACL权限,setfacl -b 文件
-d: 设定默认 ACL 权限,命令格式为 "setfacl -m d:u:用户名:权限 文件名"(如果是群组,则使用 d:g:群组名:权限),只对目录生效,指目录中新建立的文件拥有此默认权限,例如 setfacl -m d:u:st:rx /project 表示 st 用户对 project 目录中新建立的文件拥有 rx 权限。
-R: 递归设定 ACL 权限,指设定的 ACL 权限会对目录下的所有子文件生效,命令格式为 "setfacl -m u:用户名:权限 -R 文件名"(群组使用 g:群组名:权限),例如 setfacl -m u:st:rx -R /project 表示 st 用户对已存在于 project 目录中的子文件和子目录拥有 rx 权限。
-k:删除默认的ACL权限
[root@rocky-01 linux]# useradd zhangsan
[root@rocky-01 linux]# useradd lisi
[root@rocky-01 linux]# useradd user01
[root@rocky-01 linux]# groupadd tgroup
[root@rocky-01 linux]# mkdir /project
[root@rocky-01 linux]# chown root:tgroup /project
[root@rocky-01 linux]# chmod 770 /project
[root@rocky-01 linux]# ll -d /project/
drwxrwx---. 2 root tgroup 6 Oct 23 21:07 /project/
[root@rocky-01 linux]# setfacl -m u:user01:rx /project
#给用户user01赋予r-x权限,使用"u:用户名:权限" 格式
[root@rocky-01 linux]# ll -d /project
drwxrwx---+ 2 root tgroup 6 Oct 23 21:07 /project
#如果查询时会发现,在权限位后面多了一个"+",表示此目录拥有ACL权限
[root@rocky-01 linux]# getfacl /project/
getfacl: Removing leading '/' from absolute path names
# file: project/ #文件名
# owner: root #文件的所有者
# group: tgroup #文件的所属组
user::rwx #用户名栏是空的,说明是所有者的权限
user:user01:r-x 新用户user01拥有rx权限
group::rwx #组名栏是空的,说明是所属组的权限
mask::rwx #mask权限
other::--- #其他人权限
可以看到,通过设定 ACL 权限,我们可以单独给 st 用户分配 r-x 权限,而无需给 st 用户设定任何身份。
setfacl -m:给用户或群组添加 ACL 权限
[root@localhost ~]# useradd zhangsan
[root@localhost ~]# useradd lisi
[root@localhost ~]# useradd st
[root@localhost ~]# groupadd tgroup <-- 添加需要试验的用户和用户组,省略设定密码的过程
[root@localhost ~]# mkdir /project <-- 建立需要分配权限的目录
[root@localhost ~]# chown root:tgroup /project <-- 改变/project目录的所有者和所属组
[root@localhost ~]# chmod 770 /project <-- 指定/project目录的权限
[root@localhost ~]# ll -d /project
drwxrwx---. 2 root tgroup 4096 Apr 16 12:55 /project
#这时st学员来试听了,如何给她分配权限
[root@localhost ~]# setfacl -m u:st:rx /project
#给用户st赋予r-x权限,使用"u:用户名:权限" 格式
[root@localhost /]# cd /
[root@localhost /]# ll -d /project
drwxrwx---+ 2 root tgroup 4096 Apr 16 12:55 /project
#如果查询时会发现,在权限位后面多了一个"+",表示此目录拥有ACL权限
[root@localhost /]# getfacl project
#查看/prpject目录的ACL权限
#file:project <--文件名
#owner:root <--文件的所有者
#group:tgroup <--文件的所属组
user::rwx <--用户名栏是空的,说明是所有者的权限
user:st:r-x <--用户st的权限
group::rwx <--组名栏是空的,说明是所属组的权限
mask::rwx <--mask权限
other::--- <--其他人的权限
可以看到,通过设定 ACL 权限,我们可以单独给 st 用户分配 r-x 权限,而无需给 st 用户设定任何身份。
同样的道理,也可以给用户组设定 ACL 权限,例如:
[root@localhost /]# groupadd tgroup2
#添加新群组
[root@localhost /]# setfacl -m g:tgroup2:rwx project
#为组tgroup2纷配ACL权限
[root@localhost /]# ll -d project
drwxrwx---+ 2 root tgroup 4096 1月19 04:21 project
#属组并没有更改
[root@localhost /]# getfacl project
#file: project
#owner: root
#group: tgroup
user::rwx
user:st:r-x
group::rwx
group:tgroup2:rwx <-用户组tgroup2拥有了rwx权限
mask::rwx
other::---
setfacl -d:设定默认 ACL 权限
既然已经对 project 目录设定了 ACL 权限,那么,如果在这个目录中新建一些子文件和子目录,这些文件是否会继承父目录的 ACL 权限呢?执行以下命令进行验证:
[root@localhost /]# cd project
[root@localhost project]# touch abc
[root@localhost project]# mkdir d1
#在/project目录中新建了abc文件和d1目录
[root@localhost project]#ll
总用量4
-rw-r--r-- 1 root root 01月19 05:20 abc
drwxr-xr-x 2 root root 4096 1月19 05:20 d1
可以看到,这两个新建立的文件权限位后面并没有 "+",表示它们没有继承 ACL 权限。这说明,后建立的子文件或子目录,并不会继承父目录的 ACL 权限。
当然,我们可以手工给这两个文件分配 ACL 权限,但是如果在目录中再新建文件,都要手工指定,则显得过于麻烦。这时就需要用到默认 ACL 权限。
默认 ACL 权限的作用是,如果给父目录设定了默认 ACL 权限,那么父目录中所有新建的子文件都会继承父目录的 ACL 权限。需要注意的是,默认 ACL 权限只对目录生效。
例如,给 project 文件设定 st 用户访问 rx 的默认 ACL 权限,可执行如下指令:
[root@localhost /]# setfacl -m d:u:st:rx project
[root@localhost project]# getfacl project
# file: project
# owner: root
# group: tgroup
user:: rwx
user:st:r-x
group::rwx
group:tgroup2:rwx
mask::rwx
other::---
default:user::rwx <--多出了default字段
default:user:st:r-x
default:group::rwx
default:mask::rwx
default:other::---
[root@localhost /]# cd project
[root@localhost project]# touch bcd
[root@localhost project]# mkdir d2
#新建子文件和子目录
[root@localhost project]# ll 总用量8
-rw-r--r-- 1 root root 01月19 05:20 abc
-rw-rw----+ 1 root root 01月19 05:33 bcd
drwxr-xr-x 2 root root 4096 1月19 05:20 d1
drwxrwx---+ 2 root root 4096 1月19 05:33 d2
#新建的bcd和d2已经继承了父目录的ACL权限
大家发现了吗?原先的 abc 和 d1 还是没有 ACL 权限,因为默认 ACL 权限是针对新建立的文件生效的。
对目录设定的默认 ACL 权限,可直接使用 setfacl -k 命令删除。例如:
[root@localhost /]# setfacl -k project
通过此命令,即可删除 project 目录的默认 ACL 权限,读者可自行通过 getfacl 命令查看。
setfacl -R:设定递归 ACL 权限
递归 ACL 权限指的是父目录在设定 ACL 权限时,所有的子文件和子目录也会拥有相同的 ACL 权限。
例如,给 project 目录设定 st 用户访问权限为 rx 的递归 ACL 权限,执行命令如下:
[root@localhost project]# setfacl -m u:st:rx -R project
[root@localhost project]# ll
总用量 8
-rw-r-xr--+ 1 root root 01月19 05:20 abc
-rw-rwx--+ 1 root root 01月19 05:33 bcd
drwxr-xr-x+ 2 root root 4096 1月19 05:20 d1
drwxrwx---+ 2 root root 4096 1月19 05:33 d2
#abc和d1也拥有了ACL权限
注意,默认 ACL 权限指的是针对父目录中后续建立的文件和目录会继承父目录的 ACL 权限;递归 ACL 权限指的是针对父目录中已经存在的所有子文件和子目录会继承父目录的 ACL 权限。
setfacl -x:删除指定的 ACL 权限
使用 setfacl -x
命令,可以删除指定的 ACL 权限,例如,删除前面建立的 st 用户对 project 目录的 ACL 权限,执行命令如下:
[root@localhost /]# setfacl -x u:st project
#删除指定用户和用户组的ACL权限
[root@localhost /]# getfacl project
# file:project
# owner: root
# group: tgroup
user::rwx
group::rwx
group:tgroup2:rwx
mask::rwx
other::---
#st用户的权限已被删除
setfacl -b:删除指定文件的所有 ACL 权限
此命令可删除所有与指定文件或目录相关的 ACL 权限。例如,现在我们删除一切与 project 目录相关的 ACL 权限,执行命令如下:
[root@localhost /]# setfacl -b project
#会删除文件的所有ACL权限
[root@localhost /]# getfacl project
#file: project
#owner: root
# group: tgroup
user::rwx
group::rwx
other::---
#所有ACL权限已被删除
mask权限
mask 只影响除所有者和other的之外的人和组的最大权限
mask 需要与用户的权限进行逻辑与运算后,才能变成有限的权限
用户或组的设置必须存在于mask权限设定范围内才会生效,超出的权限失效
格式:setfacl -m mask::权限 file
[root@rocky-01 linux]# setfacl -m mask::rw /project/
[root@rocky-01 linux]# getfacl /project/
getfacl: Removing leading '/' from absolute path names
# file: project/
# owner: root
# group: tgroup
user::rwx
user:st:r-x #effective:r--
group::rwx #effective:rw-
mask::rw-
other::---
设定mask最大权限为rw,组rwx权限,x失效,只有rw权限,用户st权限r-x,x失效,只有r权限