9. 常用 Linux 命令与技巧
本章系统介绍 RHEL 10 运维场景中高频使用的命令与操作技巧,涵盖文件管理、文本处理、软件管理、服务与进程监控等核心方向。本章作为综合参考章节,供读者在后续实操中随时查阅。所有命令均在 linuxdc(RHEL 10,IP 192.168.1.100)环境下验证。
9.1 前提条件
- RHEL 10 已完成全部基础配置(第 1 至第 8 章)。
- 通过 SecureCRT(SSH 端口 2222)以
ops用户、密钥认证方式登录192.168.1.100,执行sudo -i切换至 root 环境。
9.2 Shell 基础
9.2.1 获取帮助
遇到不熟悉的命令,优先查阅本地文档,而非依赖搜索引擎:
man ls # 完整手册页(按 q 退出,/ 搜索)
ls --help # 简要帮助
info coreutils # GNU Coreutils 详细文档
9.2.2 常用快捷键
| 快捷键 | 功能 |
|---|---|
Ctrl + C |
中断当前命令 |
Ctrl + Z |
挂起当前进程(发送到后台) |
Ctrl + D |
退出当前 Shell |
Ctrl + L |
清屏 |
Ctrl + R |
反向搜索历史命令 |
Tab |
自动补全命令、路径或参数 |
!! |
重复执行上一条命令 |
!$ |
引用上一条命令的最后一个参数 |
Ctrl + A |
光标移到行首 |
Ctrl + E |
光标移到行尾 |
9.2.3 I/O 重定向与管道(RHCSA 官方考点)
Linux 中每个进程默认有三个数据流:标准输入(stdin,0)、标准输出(stdout,1)、标准错误(stderr,2)。重定向即改变这些数据流的默认去向。
# 标准输出重定向
echo "hello" > /tmp/out.txt # 覆盖写入(文件原有内容被清空)
echo "world" >> /tmp/out.txt # 追加写入(保留原有内容)
# 标准错误单独重定向
ls /not-exist 2> /tmp/error.log # 仅错误信息写入文件,屏幕不显示
ls /not-exist 2>> /tmp/error.log # 错误信息追加写入
# 标准输出与标准错误分别重定向到不同文件
command > /tmp/out.log 2> /tmp/err.log
# 标准输出与标准错误合并重定向到同一文件(注意顺序)
command > /tmp/all.log 2>&1 # 正确:先重定向 stdout,再让 stderr 指向 stdout 的去处
command &> /tmp/all.log # 等效简写(bash 特有)
# 丢弃输出(黑洞设备,常用于屏蔽无关紧要的输出/错误)
command > /dev/null 2>&1
# 标准输入重定向:从文件读取而非键盘输入
wc -l < /etc/passwd
# 管道:将前一个命令的标准输出作为后一个命令的标准输入
ps aux | grep nginx # 查找 nginx 相关进程
cat /etc/passwd | wc -l # 统计行数
dnf list installed | grep -i python # 过滤已安装的 Python 相关包
RHCSA 常见易错点:2>&1 的顺序
command > file 2>&1 与 command 2>&1 > file 效果不同:前者先把 stdout 指向 file,再把 stderr 指向"stdout 当前指向的地方"(即 file),二者都写入 file;后者先把 stderr 指向"stdout 当前指向的地方"(此时仍是终端),再把 stdout 改指向 file,结果 stderr 仍打印在终端、只有 stdout 写入 file。记住结论:重定向从左到右生效,2>&1 必须放在 > file 之后才能让错误信息一并写入文件。
9.2.4 创建与运行脚本
# 创建脚本
cat > /tmp/sysinfo.sh << 'EOF'
#!/bin/bash
echo "Hostname : $(hostname)"
echo "IP : $(ip -4 -brief addr show ens33 | awk '{print $3}')"
echo "Date : $(date)"
echo "Uptime : $(uptime -p)"
EOF
chmod +x /tmp/sysinfo.sh
/tmp/sysinfo.sh
Shebang 规范
脚本第一行 #!/bin/bash 明确指定解释器。生产脚本推荐使用 #!/usr/bin/env bash 以提高可移植性,避免不同系统上 bash 路径不同导致的问题。
9.3 文件与目录管理
9.3.1 基础操作
ls -lah /etc # 列出目录内容(含隐藏文件,人类可读大小)
pwd # 显示当前路径
mkdir -p /opt/app/conf # 递归创建多级目录
cp -a /etc/ssh /tmp/ssh-bak # 保留属性复制(-a 等同于 -dpR)
mv /tmp/old-name /tmp/new-name # 重命名或移动
rm -rf /tmp/test-dir # 递归删除(操作前务必确认路径)
# 硬链接与软链接(RHCSA 官方考点)
ln /etc/hostname /tmp/hostname-hard # 创建硬链接
ln -s /usr/local/app /app # 创建软链接(符号链接)
硬链接 vs 软链接
| 对比项 | 硬链接(ln) |
软链接(ln -s) |
|---|---|---|
| 本质 | 同一 inode 的另一个目录项,与原文件完全等价 | 独立文件,内容为指向目标路径的文本 |
| 跨文件系统 | 不可以(inode 号仅在同一文件系统内唯一) | 可以 |
| 链接目录 | 不可以(避免目录树出现环路) | 可以 |
| 原文件删除后 | 数据仍存在(inode 链接计数 > 0 即不释放) | 链接失效(悬空链接,显示为红色闪烁) |
| 查看方式 | ls -li 观察 inode 号相同、链接数(第 2 列)增加 |
ls -l 显示 -> 指向目标,文件类型为 l |
ls -li /etc/hostname /tmp/hostname-hard # inode 号相同,链接数为 2
ls -l /app # 显示 lrwxrwxrwx ... /app -> /usr/local/app
rm -rf 操作规范
执行前先用 ls 确认目标路径,或用 echo rm -rf <path> 预览命令再执行,养成习惯。
9.3.2 查找文件
# find:功能最强,实时扫描
find /etc -name "*.conf" -type f # 查找所有 .conf 文件
find /var/log -mtime -1 -name "*.log" # 查找 1 天内修改的日志
find / -perm /4000 -type f 2>/dev/null # 查找所有 SUID 文件(安全审计必做)
# which / whereis:定位可执行文件
which python3
whereis sshd
9.3.3 文件内容查看
cat /etc/os-release # 查看完整文件
less /var/log/messages # 分页查看(/ 搜索,q 退出)
head -20 /var/log/secure # 查看前 20 行
tail -50 /var/log/messages # 查看最后 50 行
tail -f /var/log/messages # 实时追踪新增内容
9.4 文本处理三件套
文本处理是 Linux 运维的核心技能,是日志分析、配置提取的基础工具。
9.4.1 grep — 搜索与过滤
grep "error" /var/log/messages # 搜索关键词
grep -i "failed" /var/log/secure # 忽略大小写
grep -r "PermitRootLogin" /etc/ssh/ # 递归搜索目录
grep -v "^#" /etc/ssh/sshd_config | grep -v "^$" # 过滤注释和空行(查看生效配置)
grep -n "Port" /etc/ssh/sshd_config # 显示匹配行行号
grep -c "Failed" /var/log/secure # 统计匹配行数
9.4.2 awk — 字段提取与处理
# 提取 /etc/passwd 的用户名和 UID
awk -F: '{print $1, $3}' /etc/passwd
# 过滤 UID >= 1000 的普通用户
awk -F: '$3 >= 1000 {print $1}' /etc/passwd
# 统计文件行数
awk 'END {print NR}' /var/log/messages
# 计算第 3 列的总和
awk '{sum += $3} END {print sum}' /tmp/data.txt
9.4.3 sed — 流编辑与替换
# 将文件中的字符串替换(-i.bak 备份原文件)
sed -i.bak 's/PermitRootLogin yes/PermitRootLogin no/g' /etc/ssh/sshd_config
# 删除所有注释行和空行(输出到屏幕,不修改文件)
sed '/^[[:space:]]*#/d; /^[[:space:]]*$/d' /etc/ssh/sshd_config
# 取消注释某行
sed -i 's/^#Port 22/Port 2222/' /etc/ssh/sshd_config
9.4.4 其他实用工具
cut -d: -f1,3 /etc/passwd # 按分隔符提取字段
sort -k3 -n /tmp/data.txt # 按第 3 字段数字排序
uniq -c /tmp/ips.txt # 统计重复行出现次数
wc -l /var/log/messages # 统计文件行数
tr 'a-z' 'A-Z' < /tmp/input.txt # 字母大小写转换
9.5 软件管理(dnf 与 Flatpak)
dnf 是 RHEL 10 的官方包管理器,支持事务历史与回滚。RHEL 10 仍使用 DNF4(dnf5 尚未成为默认版本),日常命令与 RHEL 9 完全一致。
# 搜索与查询
dnf search nginx # 搜索软件包
dnf info nginx # 查看详细信息
dnf provides /usr/sbin/sshd # 查询哪个包提供了某个文件
dnf list installed # 列出所有已安装包
dnf list updates # 列出可用更新
# 安装与卸载
dnf install -y nginx # 安装(-y 自动确认)
dnf remove -y nginx # 卸载
dnf autoremove # 移除孤立依赖包
# 更新
dnf check-update # 检查可用更新(不安装)
dnf update -y # 更新所有包
dnf update -y --security # 仅安装安全更新(推荐生产环境)
# 事务历史与回滚
dnf history # 查看操作历史
dnf history info <ID> # 查看某次操作详情
dnf history undo <ID> # 回滚某次操作
RHEL 9 已弃用:AppStream 模块流(dnf module)
RHEL 9 及更早版本中,Node.js、PostgreSQL 等软件通过 dnf module install <包名>:<流版本> 以模块流形式安装,需先 dnf module list 查看可用流。RHEL 10 不再分发任何模块化内容,dnf module 子命令仍存在但仅打印弃用警告,不产生实际效果。RHEL 10 中同一软件的不同大版本改为以独立命名的常规 RPM 包并行提供,直接 dnf install 即可,无需先启用流:
# RHEL 10:安装默认 LTS 版本的 Node.js
dnf install -y nodejs npm
# RHEL 10:安装指定大版本(包名内嵌版本号,示例为 Node.js 24)
dnf install -y nodejs24
Flatpak 软件包管理(RHCSA 官方新增考点)
Flatpak 是与 dnf/RPM 并行的应用分发格式,以沙盒化方式打包应用及其依赖,常用于桌面应用(如 GNOME 环境的图形工具),与 dnf 管理系统级 RPM 包互不冲突。RHCSA(EX200)已将"配置 Flatpak 仓库访问"与"安装/卸载 Flatpak 软件包"列为官方考点。
# 查看已配置的 Flatpak 远程仓库(remote)
flatpak remotes
# 添加 Flathub(最主流的第三方 Flatpak 仓库)
flatpak remote-add --if-not-exists flathub \
https://flathub.org/repo/flathub.flatpakrepo
# 搜索应用
flatpak search gimp
# 安装应用(需指定仓库名,避免多仓库同名歧义)
flatpak install -y flathub org.gimp.GIMP
# 列出已安装的 Flatpak 应用
flatpak list
# 运行 Flatpak 应用
flatpak run org.gimp.GIMP
# 更新单个/全部 Flatpak 应用
flatpak update org.gimp.GIMP
flatpak update -y
# 卸载应用(--delete-data 一并清除应用数据)
flatpak uninstall org.gimp.GIMP
flatpak uninstall --delete-data org.gimp.GIMP
# 移除已配置的远程仓库
flatpak remote-delete flathub
Flatpak 与 dnf 的分工
dnf 管理系统级 RPM 包(服务、内核模块、命令行工具等,全系统共享一份,需 root 权限安装);Flatpak 面向应用级分发(尤其图形应用),每个应用及其依赖打包在独立沙盒中运行,普通用户即可安装到自己的账户下(flatpak install --user),不影响系统其他部分。服务器场景以 dnf 为主,Flatpak 更多用于桌面/工作站场景,但两者的仓库配置与安装/卸载操作均为 RHCSA 官方考点,需两者都能熟练操作。
9.6 服务管理(systemctl)
systemctl start sshd # 启动服务
systemctl stop sshd # 停止服务
systemctl restart sshd # 重启服务
systemctl reload sshd # 重新加载配置(不重启进程)
systemctl enable sshd # 设置开机自启
systemctl disable sshd # 禁用开机自启
systemctl enable --now sshd # 启用并立即启动(最常用)
systemctl status sshd # 查看详细状态
systemctl is-active sshd # 查询是否运行(脚本中使用)
systemctl list-units --state=failed # 列出所有失败的 unit
9.7 进程管理
ps aux # 查看所有进程快照
ps -ef --forest # 树形显示进程关系
pgrep -l sshd # 按名称查找进程 PID
top # 交互式监控(M 按内存排序,q 退出)
# 终止进程
kill <PID> # 发送 SIGTERM(优雅停止)
kill -9 <PID> # 发送 SIGKILL(强制终止,谨慎使用)
pkill -f "python3 /opt/app" # 按命令模式终止进程
# 后台执行
nohup /opt/app/run.sh & # 后台运行,不受 Shell 退出影响
jobs # 查看后台任务列表
9.8 系统状态监控
# 磁盘
df -hT # 文件系统使用情况(含类型)
du -sh /var/log/* # 各子目录大小
lsblk # 块设备与挂载关系
# 内存
free -h # 内存使用(含 swap)
vmstat 1 5 # 每秒采样 5 次,观察内存与 CPU 压力
# CPU / 负载
uptime # 运行时间与 1/5/15 分钟负载
nproc # 逻辑 CPU 核心数
# 系统信息
uname -r # 内核版本
hostnamectl # 主机名、OS、内核详细信息
timedatectl # 时区与时间同步状态
9.9 日志查看(journalctl)
journalctl -u sshd # 查看 sshd 的全部日志
journalctl -u sshd -f # 实时追踪 sshd 日志
journalctl --since "1 hour ago" # 最近 1 小时的系统日志
journalctl -p err -b # 本次启动的 error 级别日志
journalctl --disk-usage # 日志占用磁盘空间
# 传统日志文件
tail -f /var/log/secure # 认证与安全日志(实时)
tail -f /var/log/messages # 系统通用日志(实时)
9.10 实践任务
- 登录
linuxdc(SecureCRT 端口 2222,ops用户,密钥认证,sudo -i切换 root)。 -
执行系统状态全览:
hostnamectl ip addr show ens33 df -hT free -h uptime timedatectl -
使用
grep提取/etc/ssh/sshd_config的生效配置(去除注释和空行):grep -v "^#" /etc/ssh/sshd_config | grep -v "^$" -
使用
awk提取/etc/passwd中 UID ≥ 1000 的用户名:awk -F: '$3 >= 1000 {print $1}' /etc/passwd -
安装
tree并查看/etc/ssh/目录结构:dnf install -y tree tree /etc/ssh/ -
查看
sshd服务状态,并查看最近 20 条日志:systemctl status sshd journalctl -u sshd -n 20
9.11 自测问题
Q1:如何查看一个已安装命令来自哪个 RPM 包?
rpm -qf $(which sshd)
# 或
dnf provides /usr/sbin/sshd
Q2:tail -f 和 journalctl -f 有什么区别?
tail -f 追踪传统文本文件的新增内容;journalctl -f 追踪 systemd journal(结构化日志),支持按服务名、优先级、时间范围等过滤,是 RHEL 10 推荐的日志查看方式。
Q3:dnf update -y 与 dnf update -y --security 有什么区别?
dnf update -y 更新所有可用包(含功能更新);dnf update -y --security 仅安装标记为安全修复的更新,变更范围更小、风险更低,是生产环境的推荐方式。
Q4:Flatpak 与 dnf 是否会管理同一个应用产生冲突?两者分别适用什么场景?
不会冲突,二者是并行的独立分发体系:dnf 管理系统级 RPM 包(全系统共享、需 root 权限),Flatpak 以沙盒方式打包应用及其全部依赖(可按用户级安装、无需 root)。服务器后台服务、命令行工具、内核相关组件用 dnf;桌面图形应用(尤其需要隔离运行环境的场景)用 Flatpak。RHCSA 要求两种方式的仓库配置与安装/卸载操作均需熟练掌握。
9.12 章节总结
本章构建了 Linux 命令行运维的核心工具集:文件管理、文本处理三件套(grep / awk / sed)、软件管理(dnf 与 Flatpak 两套并行体系)、服务管理(systemctl)、进程监控与日志查看(journalctl)。这些命令将贯穿后续所有运维操作,是每位 Linux 运维工程师的基础技能库,也是 RHCSA(EX200)"管理软件"考点分组的完整覆盖。