目录
一、软件包管理
1.在 Rocky Linux 上使用 dnf 安装 nginx
2.在 Rocky Linux 上使用 rpm 查询 nginx 安装的文件列表
3.在 Ubuntu 上使用 apt 安装 nginx
4.配置 Rocky使用阿里源
Rocky方法一
Rocky方法二
Rocky替换阿里EPEL源
5.配置Ubuntu使用清华源
6.dnf install 和 rpm -ivh 有什么区别?
7.为什么要更换镜像源?
8.apt remove 和 apt purge 有什么区别?
9.Rocky 9 和 Rocky 10 能使用相同的软件源(仓库)吗?Rocky 9.5 和 Rocky 9.7呢?
10.Ubuntu 24.04 和 26.04 软件源通用吗?
二、find+xargs命令的使用
1.find的基础应用
2.使用xargs查找删除
3.使用xargs查找拷贝
4.-print0 + xargs -0替换分隔符
三、grep 与正则表达式
1. 从 /etc/passwd 中查找以 root 开头的行
2. 从 /etc/passwd 中查找以 bash 结尾的行
3. 查看 /etc/ssh/sshd_config 的有效配置
4. 查看本机 IP 地址
5. grep -i root 和 grep root 有什么区别?
6. ^ 和 $ 分别表示什么?
7. * 和 + 有什么区别?
8. 为什么要用 grep -E ?
9. 排障时,为什么 -C 选项很有用?
四、管道与IO重定向
1.将 date 命令的输出覆盖写入 date.txt
2.将 date 命令的输出追加写入 date.txt
3.将 ls /etc/passwd /etc/xxx.txt 的错误输出重定向到 error.log
4.使用 grep -vE '^#|^$' /etc/ssh/sshd_config 查看有效配置,并用 tee 同时保存到 sshd_config.txt
5.统计 /etc/passwd 中有多少用户使用 /bin/bash 作为 Shell
6. > 和 >> 有什么区别?
7. 2>&1 是什么意思?
8. 管道 | 和重定向 > 有什么区别?
五、grep 与 find 综合实战:日志分析
六、特殊权限与文件属性
1. 给 /usr/bin/cat 设置 SUID,用普通用户读取 /etc/shadow ,观察变化
2. 给 /usr/bin/rm 设置 SUID,尝试删除 /root/ 下的文件,观察是否成功,思考为什么
3. 创建共享目录,设置 SGID,验证新文件继承目录属组
4. 给 /etc/hosts 设置 +i 属性,尝试修改和删除,观察报错
5. 给日志文件设置 +a 属性,验证只能追加不能覆盖
1. SUID、SGID、Sticky Bit 分别作用于什么对象?有什么效果?
2. chattr +i 和 chmod 000 有什么区别?
七、sudo权限委派
1.为若依项目团队配置权限
1环境准备
2配置文件
3验证权限
2. sudoers 配置中 % 前缀代表什么?
3. NOPASSWD 有什么风险?什么场景适合使用?
4. 为什么必须使用 visudo 编辑 sudoers 文件?
八、时间同步(chrony)
1.安装 chrony
2.配置阿里云时间服务器
3.启动服务,用 chronyc sources -v 查看同步状态
4.用 chronyc tracking 查看同步精度
5. 为什么服务器时间需要同步?
6. chronyc sources -v 中 ^* 和 ^? 分别表示什么?
一、软件包管理
1.在Rocky Linux上使用dnf安装nginx
# 在Rocky上使用dnf安装nginx dnf -y install nginx2.在Rocky Linux上使用rpm查询nginx安装的文件列表
# 在Rocky上使用rpm查询nginx安装的文件列表 rpm -ql nginx3.在Ubuntu上使用apt安装nginx
# 在Ubuntu上使用apt安装nginx apt -y install nginx4.配置Rocky使用阿里源
Rocky方法一
# 备份现有原文件 cp -r /etc/yum.repos.d /etc/yum.repos.d.bak # 修改配置文件 vim /etc/yum.repos.d/rocky.repo # 注释掉mirrorlist删掉baseurl的# #baseurl=https://mirrors.aliyun.com/rockylinuxRocky方法二
# 备份源文件 cp -r /etc/yum.repos.d /etc/yum.repos.d.bak # 执行镜像站配置 sed -e 's|^mirrorlist=|#mirrorlist=|g' \ -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \ -i.bak \ /etc/yum.repos.d/rocky*.repo dnf makecacheRocky替换阿里EPEL源
# 安装阿里EPEL源 dnf -y install epel-release # 查看仓库 dnf repolist # 替换EPEL源 sed -e 's|^metalink=|#metalink=|g' \ -e 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|g' \ -i.bak \ /etc/yum.repos.d/epel*.repo dnf makecache5.配置Ubuntu使用清华源
# 备份配置文件 cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak # 修改配置文件24.04 cat > /etc/apt/sources.list.d/ubuntu.sources <<EOF Types: deb URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ Suites: noble noble-updates noble-backports Components: main restricted universe multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg Types: deb URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ Suites: noble-security Components: main restricted universe multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg EOF # 修改配置文件26.04 cat > /etc/apt/sources.list.d/ubuntu.sources <<EOF Types: deb URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ Suites: resolute resolute-updates resolute-backports Components: main restricted universe multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg Types: deb URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ Suites: resolute-security Components: main restricted universe multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg EOF6.dnf install和rpm -ivh有什么区别?
1.dnf是上层,运行的时候会调用底层rpm;
2.dnf安装的时候会把依赖包一同安装,rpm安装的时候没有依赖包会提醒安装失败,需要手动安装依赖包;
3.如果在断网并且提前下载好包和依赖包的的情况下rpm非常适用。
7.为什么要更换镜像源?
为了解决访问速度和软件获取问题
8.apt remove和apt purge有什么区别?
apt remove删除程序保留配置文件,apt purge删除程序会把配置文件一并删除。
9.Rocky 9和Rocky 10 能使用相同的软件源(仓库)吗?Rocky 9.5和Rocky 9.7呢?
9和10不能使用相同软件源(大版本不能使用相同的),9.5和9.7可以使用相同软件源。
10.Ubuntu 24.04 和 26.04 软件源通用吗?
Ubuntu 24.04 和 26.04 软件源不通用,因为24.04和26.04的仓库代号是不一样的24.04是Noble,26.04是Resolute。
二、find+xargs命令的使用
1.find的基础应用
# 在 /var/log 目录下查找所有 .log 文件 find /var/log -type f -iname "*.log" # 查找 /etc 目录下大于 1MB 的文件 find /etc -type f -size +10M # 查找 7 天前修改的日志文件 find /var/log -type f -mtime +72.使用xargs查找删除
# 准备测试环境 mkdir dir1 touch dir1/file{1..10}.txt # 查看测试环境 ls dir1 # 先用 ls -l 预览要操作的文件(安全习惯) find dir1 -name "file*.txt" | xargs ls -l # 确认无误后再删除 find dir1 -name "file*.txt" | xargs rm # 验证删除结果 ls dir1/3.使用xargs查找拷贝
# 准备测试环境 mkdir dir2 touch dir2/file{1..10}.txt # 查看测试环境 ls dir2 # 方式一:使用 {} 作为占位符 find dir2 -name "file*.txt" | xargs -I {} cp -ra {} /var/tmp/ # 方式二:自定义占位符(任意字符串都可以) find dir2 -name "file*.txt" | xargs -I niu cp -ra niu /tmp/ # 验证复制结果 ls -lh /var/tmp/file*.txt ls -lh /tmp/file*.txt4.-print0+xargs -0替换分隔符
# 在 dir2 下创建一个含空格的文件名 touch dir2/"file niu.txt" # xargs 无法查看带有空格的文件名 find dir2 -name "*.txt" | xargs ls -l # 使用 -print0 和 xargs -0 搭配可以 # 管道传输时空格会被当成分隔符 find dir2 -name "*.txt" -print0 | xargs -0 ls -l三、grep与正则表达式
1.从/etc/passwd中查找以root开头的行
grep -E '^root' /etc/passwd2.从/etc/passwd中查找以bash结尾的行
grep -E 'bash$' /etc/passwd3.查看/etc/ssh/sshd_config的有效配置
grep -vE '^ *#|^$' /etc/ssh/sshd_config4.查看本机IP地址
ip a | grep -E '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b'5.grep -i root和grep root有什么区别?
grep -i root 忽略大小写,匹配root、Root、ROOT;grep root区分大小写,只匹配root。
6.^和$分别表示什么?
^ 匹配行首,$匹配行尾。
7.*和+有什么区别?
* 表示前导字符出现0次或多次;+表示前导字符出现1次或多次。
8.为什么要用grep -E?
使用扩展正则不需要转义, {n}、|、()直接写就行,更简洁,不容易出错。日常使用推荐grep -E。
9.排障时,为什么-C选项很有用?
只看错误行不够,需要看错误前后的上下文才知道发生了什么。 -C 5可以同时显示匹配行及前后各5行。
四、管道与IO重定向
1.将date命令的输出覆盖写入date.txt
date > date.txt2.将date命令的输出追加写入date.txt
date >> date.txt3.将ls /etc/passwd /etc/xxx.txt的错误输出重定向到error.log
ls /etc/passwd /etc/xxx.txt 2> error.log4.使用grep -vE '^#|^$' /etc/ssh/sshd_config查看有效配置,并用tee同时保存到sshd_config.txt
grep -vE '^#|^$' /etc/ssh/sshd_config | tee sshd_config.txt5.统计/etc/passwd中有多少用户使用/bin/bash作为Shell
grep -E 'bash$' /etc/passwd | wc -l6.>和>>有什么区别?
> 覆盖写入,文件原有内容被清空;>>追加写入,新内容加在文件末尾。
7.2>&1是什么意思?
将标准错误(FD 2)重定向到标准输出(FD 1)当前指向的位置,实现正确和错误输出到同一个地方。
8.管道|和重定向>有什么区别?
> 将命令输出写入文件;|将命令输出传递给另一个命令作为输入。管道用于命令组合,重定向用于文件读写。
五、grep与find综合实战:日志分析
从 /var/log目录找出最近7天内包含"error"或"failed"的日志文件,提取前10条生成摘要报告,并 统计各文件的错误出现次数。
# 核心命令 # 查找最近 7 天修改的文件,把错误信息丢掉,传给 grep 通过正则表达式搜索包含error和failed的日志不论大小写,只输出前10条 find /var/log/ -type f -mtime -7 2> /dev/null | xargs grep -iE "error|failed" | head -10 # 查找最近 7 天修改的文件,把错误信息丢掉,传给 grep 通过正则表达式搜索包含error和failed的日志不论大小写并统计匹配行数,再通过管道过滤掉行尾是0的结果。 find /var/log/ -type f -mtime -7 2>/dev/null | xargs grep -icE "error|failed" | grep -v "0$"# 新建一个脚本用来生成报告 vim /root/gen_report.sh # 脚本内容 #!/bin/bash REPORT="/root/error_report.txt" echo "日志错误摘要报告" > "$REPORT" echo "生成时间: $(date)" >> "$REPORT" echo "========================================" >> "$REPORT" echo "" >> "$REPORT" echo "【各文件错误次数统计】" >> "$REPORT" find /var/log/ -type f -mtime -7 2>/dev/null | xargs grep -icE "error|failed" | grep -v "0$" >> $REPORT echo "" >> "$REPORT" echo "【前 10 条错误详情(文件名+行号)】" >> "$REPORT" find /var/log/ -type f -mtime -7 2>/dev/null | xargs grep -inE "error|failed" | head -10 >> $REPORT echo "" echo "报告已生成: $REPORT"六、特殊权限与文件属性
1.给/usr/bin/cat设置SUID,用普通用户读取/etc/shadow,观察变化
普通用户权限不够无法读取shadow
查询修改head的SUID
head加SUID后普通用户执行是以root身份执行
2.给/usr/bin/rm设置SUID,尝试删除/root/下的文件,观察是否成功,思考为什么
普通用户没有权限删除root用户下的文件
查询修改rm的SUID
rm加SUID后普通用户执行是以root身份执行
3.创建共享目录,设置SGID,验证新文件继承目录属组
在设置SGID之前,目录下新建的文件和目录属组都是创建者的主组
设置SGID后目录下新建的文件和目录会集成目录属组
4.给/etc/hosts设置+i属性,尝试修改和删除,观察报错
给/etc/hosts设置+i 属性,防止修改
删除和写入都无法执行
5.给日志文件设置+a属性,验证只能追加不能覆盖
设置+a属性只能追加不能覆盖
1. SUID、SGID、Sticky Bit分别作用于什么对象?有什么效果?
SUID 作用于可执行文件,用户执行时临时获得文件属主权限;SGID作用于目录,新文件继承目录属组;Sticky Bit作 用于目录,仅文件属主可删除。
2.chattr +i和chmod 000有什么区别?
chmod 000 设置普通权限,root可以无视;chattr +i是更底层的扩展属性,root也无法修改或删除,需要先解 除 -i。
七、sudo权限委派
1.为若依项目团队配置权限
| 角色 | 成员 | 权限需求 |
|---|---|---|
| 运维组 | ruoyi-ops | 可以重启Nginx,可以查看所有日志 |
| DBA组 | ruoyi-dba | 可管理MySQL |
| 开发组 | ruoyi-dev | 可以查看应用日志 |
1环境准备
# 环境准备 # 创建用户组 groupadd ops groupadd dba groupadd dev # 创建用户 useradd ruoyi-ops -G ops useradd ruoyi-dba -G dba useradd ruoyi-dev -G dev # 设置用户密码 echo "ruoyi-ops:yjbb521" |chpasswd echo "ruoyi-dba:yjbb521" |chpasswd echo "ruoyi-dev:yjbb521" |chpasswd # 安装 Nginx 和 MySQL dnf -y install nginx mysql-server systemctl start nginx mysqld ps aux |grep -E 'nginx|mysqld' # 设置立刻启动和开机自启动 systemctl enable --now nginx mariadb2配置文件
# 通过 visudo 写配置文件 visudo -f /etc/sudoers.d/ruoyi # 配置文件 # 用户别名 User_Alias OPS = ruoyi-ops User_Alias DBA = ruoyi-dba User_Alias DEV = ruoyi-dev # 命令别名 Cmnd_Alias NGINX_CMDS = /usr/bin/systemctl restart nginx, /usr/bin/systemctl status nginx Cmnd_Alias MYSQL_CMDS = /usr/bin/systemctl start mysqld, /usr/bin/systemctl stop mysqld, /usr/bin/systemctl status mysqld Cmnd_Alias LOG_CMDS = /usr/bin/tail -f /var/log/ruoyi/access.log, /usr/bin/tail -f /var/log/ruoyi/error.log, /usr/bin/cat /var/log/ruoyi/access.log, /usr/bin/cat /var/log/ruoyi/error.log, /usr/bin/tail -f /var/log/secure, /usr/bin/cat /var/log/secure # 权限配置 # 运维组:管理 Nginx + 查看日志(需要密码) OPS ALL=(ALL) NGINX_CMDS, LOG_CMDS # DBA 组:管理 MySQL(需要密码) DBA ALL=(ALL) MYSQL_CMDS # 开发组:查看日志(免密码,低风险) DEV ALL=(ALL) NOPASSWD: LOG_CMDS3验证权限
2. sudoers配置中%前缀代表什么?
% 表示后面跟的是组名。%devops ALL=(ALL) ALL表示devops组的所有成员都有sudo权限。
3.NOPASSWD有什么风险?什么场景适合使用?
风险:用户执行 sudo命令时不需要输入密码,如果账号被盗,攻击者可以直接执行特权命令。适合对低风险命令(如 systemctl status、查看日志等只读操作)使用,且用户应该是可信的。
4.为什么必须使用visudo编辑sudoers文件?
visudo 会在保存前检查语法错误,防止配置错误导致sudo完全无法使用。如果直接编辑/etc/sudoers出现语法错误,整个系统的 sudo可能失效,修复起来非常麻烦。
八、时间同步(chrony)
1.安装chrony
dnf install -y chrony2.配置阿里云时间服务器
vim /etc/chrony.conf3.启动服务,用chronyc sources -v查看同步状态
4.用chronyc tracking查看同步精度
5.为什么服务器时间需要同步?
日志分析、HTTPS证书、JWT Token验证、数据库事务都依赖准确时间。时间不准会导致用户无法登录、证书报错、 排查困难。
6.chronyc sources -v中^*和^?分别表示什么?
^* 表示当前正在使用的同步源;^?表示该时间服务器不可达。