9. 常用 Linux 命令与技巧
本章系统介绍 RHEL 9 运维场景中高频使用的命令与操作技巧,涵盖文件管理、文本处理、软件管理、服务与进程监控等核心方向。本章作为综合参考章节,供读者在后续实操中随时查阅。所有命令均在 linuxdc(RHEL 9,IP 192.168.1.100)环境下验证。
9.1 前提条件
- RHEL 9 已完成全部基础配置(第 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 创建与运行脚本
# 创建脚本
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 # 递归删除(操作前务必确认路径)
ln -s /usr/local/app /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)
dnf 是 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> # 回滚某次操作
# AppStream 模块流
dnf module list # 列出所有模块
dnf module list nodejs # 查看 nodejs 可用版本
dnf module install nodejs:20 # 安装指定模块流版本
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 9 推荐的日志查看方式。
Q3:dnf update -y 与 dnf update -y --security 有什么区别?
dnf update -y 更新所有可用包(含功能更新);dnf update -y --security 仅安装标记为安全修复的更新,变更范围更小、风险更低,是生产环境的推荐方式。
9.12 章节总结
本章构建了 Linux 命令行运维的核心工具集:文件管理、文本处理三件套(grep / awk / sed)、软件管理(dnf)、服务管理(systemctl)、进程监控与日志查看(journalctl)。这些命令将贯穿后续所有运维操作,是每位 Linux 运维工程师的基础技能库。