跳转至

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 实践任务

  1. 登录 linuxdc(SecureCRT 端口 2222,ops 用户,密钥认证,sudo -i 切换 root)。
  2. 执行系统状态全览:

    hostnamectl
    ip addr show ens33
    df -hT
    free -h
    uptime
    timedatectl
    
  3. 使用 grep 提取 /etc/ssh/sshd_config 的生效配置(去除注释和空行):

    grep -v "^#" /etc/ssh/sshd_config | grep -v "^$"
    
  4. 使用 awk 提取 /etc/passwd 中 UID ≥ 1000 的用户名:

    awk -F: '$3 >= 1000 {print $1}' /etc/passwd
    
  5. 安装 tree 并查看 /etc/ssh/ 目录结构:

    dnf install -y tree
    tree /etc/ssh/
    
  6. 查看 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)"管理软件"考点分组的完整覆盖。