这条命令在查什么
dnf list 用来列出软件包的三类信息:已安装的、仓库可用的、以及带版本号的查询结果。核查资产与版本合规时最常用的是 list installed,它只读本地 rpmdb,不访问网络,因此可以当作离线盘点工具使用;不带子命令的 dnf list 会把仓库里的全部可装包一并列出,语义和输出量完全不同。
基本信息
| 全量已装 | dnf list installed |
|---|---|
| 单包两态 | dnf list nginx(同时显示已装与仓库版本) |
| 只看某来源 | dnf list installed --repo <repo id> |
| 过滤输出 | 配合 grep/awk,或在脚本里用 dnf repoquery 更精细 |
| 导出留档 | 重定向到文件,用于审计与基线比对 |
| 权限要求 | 普通用户可查;查询全部包信息通常需 root 或 sudo |
典型使用场景
- 接手上线系统时快速摸清装了哪些中间件与运行时
- 等保或合规审计要求提供软件清单,按月导出留档
- 迁移前比对源机与目标机的包差异,避免遗漏依赖
- 排查漏洞公告影响面:按包名过滤确认版本是否命中受影响区间
- 批量终端巡检时把清单收集回管理平台做统一比对
资产盘点示例
资产盘点示例
dnf list installed | wc -l # 已装包总数,作为盘点基准值
dnf list installed | grep -E 'nginx|java|mysql' # 按关键字过滤关键组件
dnf list nginx # 同时看已装版本与仓库可用版本
dnf list installed > /tmp/pkgs-$(date +%F).txt # 落盘留档,文件名带日期便于版本比对
dnf repoquery --installed -a | wc -l # 只列包名,输出更规整,适合脚本消费版本比对与差异核对
版本比对与差异核对
dnf list installed nginx # 第一列是包名.架构,第二列版本号,第三列是来源仓库
diff <(cut -d' ' -f1 old.txt) <(cut -d' ' -f1 new.txt) # 两次盘点结果比对,定位新增与缺失
rpm -q --qf '%{NAME} %{VERSION}-%{RELEASE}\n' nginx # 需要精确版本号时用 rpm 查询输出逐列读法
| 列 | 含义 | 正常与异常 |
|---|---|---|
| 第一列 | 包名与架构(如 nginx.x86_64) | 出现 i686 等非预期架构需确认是否需要清理 |
| 第二列 | 版本-发布号(epoch 有时前置) | 与基线不一致说明版本漂移 |
| 第三列 | 来源仓库标识 | 显示 @System 或 @命令行为本地安装,非仓库来源要留意 |
| 首行标题 | Installed Packages 或 Available Packages | 确认当前输出的是已装还是可装,避免看错语义 |
| 无任何输出 | 该包未安装 | 排查依赖缺失时先确认包名拼写与仓库是否启用 |
dnf list installed 读的是本地 rpmdb,断网可用;而 dnf list 不带参数会尝试同步仓库元数据,内网源不可达时会报错或长时间等待。
需要机器可读的稳定输出时,优先用 dnf repoquery 或 rpm -qa,格式比 dnf list 更适合脚本解析。