第二周作业
shell
1. 总结通配符,管道,重定向,并且结合示例,添加注释信息
2. 总结linux用户和用户组相关知识点以及常见的操作命令,添加注释信息
3. 总结文件权限管理相关的知识点,包括权限位,特殊权限和ACL,添加详细的注释和解释
4. 总结文件时间戳的用法
5. 总结find和xargs的用法
6. 总结几种压缩工具的使用方法
1. 通配符
符号 | 说明 |
---|---|
* | 匹配任意字符, 0个或任意个 |
? | 匹配任意单个字符, 有且只能有一个 |
[a-zA-Z0-9] | 匹配指定单个字符 |
序列, 生成指定范围的序列 |
1.1 * 使用方式
shell
# 匹配所以以.conf结尾的文件
[root@RockyLinux1 ~]# ll /etc/*.conf | head -n 5
-rw-r--r--. 1 root root 1370 Apr 27 18:59 /etc/chrony.conf
-rw-r--r--. 1 root root 117 Jun 11 23:25 /etc/dracut.conf
-rw-r--r--. 1 root root 9 Jun 23 2020 /etc/host.conf
-rw-r--r--. 1 root root 8979 Jun 15 12:47 /etc/kdump.conf
-rw-r--r--. 1 root root 880 Jun 25 03:52 /etc/krb5.conf
# 列出所有包含"d"的文件
[root@RockyLinux1 ~]# ls *d*
anaconda-ks.cfg demo.sh
# 干掉Linux, 或者删除指定目录下的所有文件
[root@RockyLinux1 ~]# rm -rf /*
1.2 ? 使用方式
shell
# 查找固定长度的文件名
[root@RockyLinux1 ~]# ll /var/log/???.log
-rw-r--r-- 1 root root 246581 Jul 3 11:29 /var/log/dnf.log
[root@RockyLinux1 ~]# ll /var/log/???????.log
-rw-r--r-- 1 root root 42004 Jul 3 11:29 /var/log/dnf.rpm.log
# 查找第二个字符为b的文件, 列出的结果不符合, 可能是匹配到的是个目录, 可以搭配echo输出
[root@RockyLinux1 ~]# ls /etc/?b*
session.conf session.d system.conf system.d
[root@RockyLinux1 ~]# echo /etc/?b*
/etc/dbus-1
# -d查看目录本身
[root@RockyLinux1 ~]# ls -d /etc/?b*
/etc/dbus-1
1.3 [] 使用方式
shell
# 查看所有以y开头的文件, []当作一个可以定制化的?来使用即可
[root@RockyLinux1 ~]# ll /usr/bin/[y]*
-rwxr-xr-x 1 root root 32064 May 2 16:31 /usr/bin/yes
lrwxrwxrwx. 1 root root 8 May 16 2022 /usr/bin/ypdomainname -> hostname
lrwxrwxrwx 1 root root 5 May 4 11:12 /usr/bin/yum -> dnf-3
# 列出bcd任意一个字符开头的文件
[root@RockyLinux1 ~]# ll /usr/bin/[bcd]*
# 列出a-z任意一个字符开头的文件
[root@RockyLinux1 ~]# ll /usr/bin/[a-z]*
1.4 {} 使用方式
shell
# {}的主要作用, 是用来生成一个序列
[root@RockyLinux1 ~]# echo {1..9}
1 2 3 4 5 6 7 8 9
# 序列是可以拼接的
[root@RockyLinux1 ~]# echo {1..9}.txt
1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt
# touch {1..9}.txt, 实际上执行的就是 touch 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt
[root@RockyLinux1 ~]# touch {1..9}.txt
[root@RockyLinux1 ~]# ls [0-9].txt
1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt
# 指定步长, 即每次迭代时的数量, 默认为1
[root@RockyLinux1 ~]# echo {1..9..2}
1 3 5 7 9
2. 管道
管道的作用: 将管道符前面命令的标准输出, 当作管道符后面命令的标准输入, 没有标准输出/命令不能从标准输入读取数据也可以使用管道, 只是没有连接的意义
shell
# mkdir test创建一个目录, 成功了是没有输出的, 虽然cat能够从标准输入读取数据, 但是没有数据执行就没有意义
[root@RockyLinux1 ~]# mkdir test | cat
# echo有输出, 但是ls不支持从标准输入读取数据, 列出的还是当前目录, 而不是指定的内容, 因此也是没有意义的
[root@RockyLinux1 ~]# echo 1.txt | ls
1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt anaconda-ks.cfg demo.sh nohup.out root@11.0.0.3 test xxx.txt
# 通过ls查看, 发现输出的内容都是在同一行
[root@RockyLinux1 ~]# ls [0-5].txt
1.txt 2.txt 3.txt 4.txt 5.txt
# 管道交给cat -A, 可以发现, ls的内容, 每个都是独立的行, 而不是单纯的展示出来的一行空格分割
[root@RockyLinux1 ~]# ls [0-5].txt | cat -A
1.txt$
2.txt$
3.txt$
4.txt$
5.txt$
3. 重定向
重定向: 默认的重定向, 是输出到终端的, 可以通过> | >>
的方式, 改变数据的流量, 常见的就是到文件, 而不是输出到终端.
3.1 追加与覆盖
shell
# >: 覆盖
# >>: 追加
[root@RockyLinux1 ~]# echo 123 >> 1.txt
# 追加重定向, 会在最后新加行
[root@RockyLinux1 ~]# cat 1.txt
123
123
# 直接清空原文件内容, 在写入新内容
[root@RockyLinux1 ~]# echo 456 > 1.txt
[root@RockyLinux1 ~]# cat 1.txt
456
# 快速清空文件的方式
[root@RockyLinux1 ~]# cp /etc/passwd ./; > passwd
[root@RockyLinux1 ~]# cat passwd
3.2 标准输出
shell
# 1>, 1>> | >, >>: 标准输出重定向, 1为标准输出, 默认值
# 1.txt存在, 则是一个标准输出, 输出的内容重定向到2.txt
[root@RockyLinux1 ~]# ls 1.txt > 2.txt
[root@RockyLinux1 ~]# cat 2.txt
1.txt
# 11.txt不存在, ls找不到文件会提示错误信息, 这个属于标准错误, 不会被标准输出捕获
[root@RockyLinux1 ~]# ls 11.txt > 2.txt
ls: cannot access '11.txt': No such file or directory
# 没有标准输出, 就是空, 等同于执行了>2.txt, 会清空2.txt原有的内容
[root@RockyLinux1 ~]# cat 2.txt
3.3 标准错误
shell
# 2>, 2>>: 标准错误重定向, 指的是程序执行时的一些错误输出, 不一定是程序报错, 只是命令内部逻辑认为是一个错误信息
# 1.txt存在, 则输出标准错误, 2>只会捕获标准错误
[root@RockyLinux1 ~]# ls 1.txt 2> 2.txt
1.txt
# 11.txt不存在, 是一个标准错误, 被2>重定向到2.txt, 不会在输出到屏幕
[root@RockyLinux1 ~]# ls 11.txt 2> 2.txt
[root@RockyLinux1 ~]# cat 2.txt
ls: cannot access '11.txt': No such file or directory
3.4 标准输入
shell
# <<< "哈哈哈": 标准输入, 可以直接输出字符串
# < file: 标准输入, 需要一个文件
[root@RockyLinux1 ~]# cat <<< "哈哈哈"
哈哈哈
[root@RockyLinux1 ~]# cat < 1.txt
mkdir: cannot create directory 'test/': File exists
3.5 双重定向
shell
# curl有一个比较特殊的地方, 建立连接的信息会被认为是标准错误, 在正常请求完成后会被隐藏起来, 这也就导致, 不管是> 或 2>, 都无法将所有的信息都屏蔽掉
[root@RockyLinux1 ~]# curl http://11.0.0.1/
你好, 世界
[root@RockyLinux1 ~]# curl http://11.0.0.1/ > /dev/null
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 15 100 15 0 0 15000 0 --:--:-- --:--:-- --:--:-- 15000
[root@RockyLinux1 ~]# curl http://11.0.0.1/ 2> /dev/null
你好, 世界
# 将标准错误和标准输出全部全定向方式1: 标准输出到/dev/null, 标准错误到标准输出, 链条式重定向
[root@RockyLinux1 ~]# curl http://11.0.0.1/ > /dev/null 2>&1
# 方式2: 新写法, 老系统可能不支持
[root@RockyLinux1 ~]# curl http://11.0.0.1/ &> /dev/null
4. 用户相关
4.1 用户分类
-
管理员: 默认为root用户, uid为0, 实际上, Linux就是以uid来判定用户身份的, 0就是管理员
-
系统用户: uid通常为1-999, 这类用户通常是运行各种服务使用的用户, 例如sshd, mysql, nginx等
-
普通用户: uid为1000+, 默认创建出来的用户, 就是依次递增的
4.2 用户相关文件
-
/etc/passwd: 记录用户的基本信息, 用户名称, uid, gid, 登录所使用的shell等
-
/etc/shadow: 记录用户的密码信息
-
/etc/group|/etc/gshadow: 组相关信息
4.3 创建普通用户
创建普通用户, 不建议指定uid/gid, 按照默认自动增长即可, 尽可能的保证每个用户的uid和gid都是样的, 方便与管理, 而不是uid10086, gid 10000这样杂乱无章的
shell
# 创建用户
[root@RockyLinux1 ~]# useradd zhangfei
[root@RockyLinux1 ~]# grep zhangfei /etc/passwd
zhangfei:x:1001:1001::/home/zhangfei:/bin/bash
# 默认情况下, 创建一个用户, 会自动创建一个同名的组作为该用户的主组
[root@RockyLinux1 ~]# id zhangfei
uid=1001(zhangfei) gid=1001(zhangfei) groups=1001(zhangfei)
# 密码设置
[root@RockyLinux1 ~]# passwd zhangfei
Changing password for user zhangfei.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
# 登录测试
[root@RockyLinux1 ~]# ssh zhangfei@127.0.0.1 'whoami'
zhangfei@127.0.0.1's password:
zhangfei
# Rocky创建用户, 默认就会创建家目录, Ubuntu需要显示的指定 -m 才会创建家目录
[root@RockyLinux1 ~]# ls -A ~zhangfei
.bash_logout .bash_profile .bashrc
4.4 删除用户
shell
# 删除用户, 默认情况下, 删除用户, 会保留家目录, 只是把/etc/passwd, /etc/shadow, 还有组的信息删除掉
[root@RockyLinux1 ~]# ll /home/
drwx------ 2 admin admin 62 Jun 30 23:12 admin
drwx------ 2 zhangfei zhangfei 62 Jul 7 22:21 zhangfei
[root@RockyLinux1 ~]# userdel admin
[root@RockyLinux1 ~]# id admin
id: 'admin': no such user
[root@RockyLinux1 ~]# ll /home/
total 0
drwx------ 2 1000 1000 62 Jun 30 23:12 admin
drwx------ 2 zhangfei zhangfei 62 Jul 7 22:21 zhangfei
# 加上-r选项, 删除比较彻底
[root@RockyLinux1 ~]# userdel -r zhangfei
[root@RockyLinux1 ~]# ll /home/
total 0
drwx------ 2 1000 1000 62 Jun 30 23:12 admin
4.5 创建系统用户
创建方式1: 不推荐s
shell
# 通过-u选项指定uid, 会有warning提示, 但是不影响创建成功, 但是gid是从1000开始的
[root@RockyLinux1 ~]# useradd -u 99 liubei
useradd warning: liubei's uid 99 outside of the UID_MIN 1000 and UID_MAX 60000 range.
[root@RockyLinux1 ~]# id liubei
uid=99(liubei) gid=1000(liubei) groups=1000(liubei)
# -r选项表示创建一个系统用户, 这个时候就不会报错, 并且gid也是1000以内
[root@RockyLinux1 ~]# useradd -r -u 100 guanyu
[root@RockyLinux1 ~]# id guanyu
uid=100(guanyu) gid=992(guanyu) groups=992(guanyu)
创建方式2: 推荐
shell
# 创建一个gid为555的nginx2组
[root@RockyLinux1 ~]# groupadd -g 555 nginx2
# 创建一个uid为555, gid为555的系统用户nginx2
[root@RockyLinux1 ~]# useradd -r -u 555 -g 555 nginx2
# uid=gid, 这样看着就舒服多了
[root@RockyLinux1 ~]# id nginx
uid=996(nginx) gid=993(nginx) groups=993(nginx)
4.6 密码的修改
交互式: 执行命令后, 需要用户输入相关信息才能继续
非交互式: 一条命令搞定, 不需要在执行过程中操作
shell
# Rocky的非交互式修改密码方式, --stdin支持从标准输入中读取数据作为密码, 下面两种方式效果是一样的
[root@RockyLinux1 ~]# passwd --stdin liubei <<< "123456"
[root@RockyLinux1 ~]# echo "123456" | passwd --stdin liubei
Changing password for user liubei.
passwd: all authentication tokens updated successfully.
[root@RockyLinux1 ~]# ssh liubei@127.0.0.1 "whoami"
liubei@127.0.0.1's password:
liubei
# 通用与Rocky/Ubuntu的写法, ubuntu的passwd命令, 是不支持--stdin的
# 方式1: 取巧的写法
[root@RockyLinux1 ~]# echo -e "12345678\n12345678" | passwd liubei
Changing password for user liubei.
New password: BAD PASSWORD: The password fails the dictionary check - it is too simplistic/systematic
Retype new password: passwd: all authentication tokens updated successfully.
# 方式2: 规范的写法
[root@RockyLinux1 ~]# echo "liubei:123456" | chpasswd
[root@RockyLinux1 ~]# ssh liubei@127.0.0.1 "whoami"
liubei@127.0.0.1's password:
liubei
5. 权限
Linux中的基本权限, 分为三组: 所有者, 所属组, 其他人, 每一组都对应三个权限位: r(读)w(写)x(执行), 没有权限以0/-表示
shell
[root@RockLinux9-5 ~]# ll file.txt
- rw- r-- r-- 1 root root 0 Jun 16 11:01 file.txt
文件类型标致 所有者权限 所属组权限 其他人权限
5.1 文件属性修改
shell
# 修改文件的所有者
[root@RockyLinux1 ~]# chown nginx 1.txt
[root@RockyLinux1 ~]# ll 1.txt
-rw-r--r-- 1 nginx root 56 Jul 7 22:01 1.txt
# 同时修改文件的所有者和所属组
[root@RockyLinux1 ~]# chown root:nginx 1.txt
[root@RockyLinux1 ~]# ll 1.txt
-rw-r--r-- 1 root nginx 56 Jul 7 22:01 1.txt
# 只修改所属组
[root@RockyLinux1 ~]# chown :root 1.txt
[root@RockyLinux1 ~]# ll 1.txt
-rw-r--r-- 1 root root 56 Jul 7 22:01 1.txt
# 递归修改目录下的所有文件的属性, 目录本身的属性也会被修改
[root@RockyLinux1 ~]# touch test/{1..3}.txt
[root@RockyLinux1 ~]# chown -R nginx:nginx test/
[root@RockyLinux1 ~]# ll -d test/
drwxr-xr-x 2 nginx nginx 45 Jul 7 22:50 test/
[root@RockyLinux1 ~]# ll -d test/*
-rw-r--r-- 1 nginx nginx 0 Jul 7 22:50 test/1.txt
-rw-r--r-- 1 nginx nginx 0 Jul 7 22:50 test/2.txt
-rw-r--r-- 1 nginx nginx 0 Jul 7 22:50 test/3.txt
5.2 文件权限修改
shell
# a=ugo, 同时为三组权限设置, u = 所有者, g = 所属组, o = 其他人, 不写也默认为a
[root@RockyLinux1 ~]# chmod a+x 1.txt
[root@RockyLinux1 ~]# chmod +x 2.txt
[root@RockyLinux1 ~]# ll 1.txt 2.txt
-rwxr-xr-x 1 root root 56 Jul 7 22:01 1.txt
-rwxr-xr-x 1 root root 54 Jul 7 22:15 2.txt
# 也可以单独为某一组或者两组设置权限
[root@RockyLinux1 ~]# chmod ug-x 1.txt
[root@RockyLinux1 ~]# ll 1.txt
-rw-r--r-x 1 root root 56 Jul 7 22:01 1.txt
# 覆盖写法
[root@RockyLinux1 ~]# chmod ug=x 1.txt
[root@RockyLinux1 ~]# ll 1.txt
---x--xr-x 1 root root 56 Jul 7 22:01 1.txt[root@RockyLinux1 ~]# chmod ug=x 1.txt
[root@RockyLinux1 ~]# ll 1.txt
---x--xr-x 1 root root 56 Jul 7 22:01 1.txt
5.3 数字修改权限
r = 4, w = 2, x = 1, 需要什么权限, 将权限对应的数字相加即可, 例如rw, 就是4+2, rwx就是7, 没有任何权限就是0, 每一组权限, 最大值为7, 最小值为0
shell
# 等同于: chmod u=rwx,go=rx 1.txt
[root@RockyLinux1 ~]# chmod 755 1.txt
[root@RockyLinux1 ~]# ll 1.txt
-rwxr-xr-x 1 root root 56 Jul 7 22:01 1.txt
5.4 默认权限
umask是掩码位置, 第一个是特殊权限位, 后面三个是普通权限, 文件的最大权限是0666, 目录则是0777, 相减即可
shell
[root@RockyLinux1 ~]# umask
0022
# 普通文件权限: 666 - 0022 = 644
[root@RockyLinux1 ~]# touch file1.txt
[root@RockyLinux1 ~]# ll file1.txt
-rw-r--r-- 1 root root 0 Jul 7 22:59 file1.txt
# 目录权限: 777 - 0022 = 755
[root@RockyLinux1 ~]# ll -d test/
drwxr-xr-x 2 nginx nginx 45 Jul 7 22:50 test/
5.5 特殊权限
SUID = 4, SGID = 2, Stickbit = 1, 在设置权限前, 添加上对应的数字, 即可设置相应的特殊权限
5.5.1 SUID
一般是设置在可执行的二进程程序上, 当其他用户执行该程序时, 会自动以该程序的所有者身份来执行, 会占用所有者权限的执行权限位置, 如果有执行权限, 则小写(s), 如果没有执行权限, 则大写(S)
shell
# 使用liubei用户, 读取/etc/shadow是拒绝的
[liubei@RockyLinux1 ~]$ whoami
liubei
[liubei@RockyLinux1 ~]$ cat /etc/shadow | head -n 1
cat: /etc/shadow: Permission denied
# 设置SUID, cat命令的所有者是root, 执行权限位置上为s, 当其他用户使用cat时, 相当于是root用户在执行
[root@RockyLinux1 ~]# chmod 4755 /usr/bin/cat
[root@RockyLinux1 ~]# ll /usr/bin/cat
-rwsr-xr-x 1 root root 36312 May 2 16:31 /usr/bin/cat
# 再次使用liubei用户读取/etc/shadow
[liubei@RockyLinux1 ~]$ cat /etc/shadow | head -n 1
root:$6$u9X.NIL9uzevTtxo$G2FJvInLaPAWIfITux6ksznABNnxfkFOAj1utGqfHEK/hEo9rA6qRJMkWk9KExySmzd.pFgp.qFTHEEe5MGgH/::0:99999:7:::
# 将touch设置suid
[root@RockyLinux1 ~]# chmod 4755 /usr/bin/touch
# liubei使用touch创建文件, 文件的所有者是root
[liubei@RockyLinux1 ~]$ touch 1.txt
[liubei@RockyLinux1 ~]$ ll 1.txt
-rw-r--r-- 1 root liubei 0 Jul 7 23:05 1.txt
5.5.2 SGID
设置在目录上, 占用所属组的执行权限位置, 小写(s)表示可执行, 大写(S)表示不可执行, 设置SGID的目录, 下面创建的所有文件的所属组, 都会继承该目录的所属组
shell
# 创建/test目录, 并且设置SGID
[root@RockyLinux1 ~]# mkdir /test; chmod 2777 /test
# 切换用户创建文件测试
[root@RockyLinux1 ~]# su - liubei
Last login: Mon Jul 7 23:05:10 CST 2025 on pts/0
[liubei@RockyLinux1 ~]$ echo 123 > /test/1.txt
# 所有者为liubei, 所属组继承/test目录为root
[liubei@RockyLinux1 ~]$ ll /test/
total 4
-rw-r--r-- 1 liubei root 4 Jul 7 23:08 1.txt
5.5.3 Stickbit
Stickbit, 为目录创建, 可以限制目录下的文件删除/修改, 占用其他人的执行权限位置, 小写(t)表示有执行权限, 大写(T)表示没有执行权限
通常是设置在公共目录上, 多个用户都在该目录下创建自己的文件, 为了防止A用户的文件被B用户修改删除, 则可以使用该方式, /tmp目录就是一个设置了Stticbit的目录
shell
# 创建用户
[root@RockyLinux1 ~]# useradd A; useradd B
# 创建对应目录
[root@RockyLinux1 ~]# mkdir /test2; chmod 1777 /test2
[root@RockyLinux1 ~]# ll -d /test2/
drwxrwxrwt 2 root root 6 Jul 7 23:11 /test2/
# A用户在/test2/下创建自己的文件
[root@RockyLinux1 ~]# su - A
[A@RockyLinux1 ~]$ echo 123 > /test2/A.txt
# B用户可以读取A在/test2下创建的文件, 但是无法修改, 无法删除
[B@RockyLinux1 ~]$ cat /test2/A.txt
123
[B@RockyLinux1 ~]$ echo 123 > /test2/A.txt
-bash: /test2/A.txt: Permission denied
[B@RockyLinux1 ~]$ rm -rf /test2/A.txt
rm: cannot remove '/test2/A.txt': Operation not permitted
5.6 特殊属性
特殊属性对root用户也是有限制的, 不会显式的展示出属性信息, 需要特定的命令查看, 特殊属性:
- a: 只允许追加, 不能编辑/删除原有内容
- i: 不能修改/删除/重命名
- ...........................................................................
shell
# 设置i属性
[root@RockyLinux1 ~]# chattr +i 1.txt
# 查看属性
[root@RockyLinux1 ~]# lsattr 1.txt
----i----------------- 1.txt
# root用户也无法删除该文件
[root@RockyLinux1 ~]# rm -rf 1.txt
rm: cannot remove '1.txt': Operation not permitted
# 在基础信息上是看不出来差异的
[root@RockyLinux1 ~]# ll 1.txt
-rwxrwxrwx 1 root root 56 Jul 7 22:01 1.txt