Linux命令-rpm2cpio(RPM包文件提取工具)
- 🔰简介
- 📖语法
- ⚙️选项
- 💡示例
- 示例 1:查看 RPM 包内容(不解压)
- 示例 2:提取 RPM 包中的单个文件
- 示例 3:提取 RPM 包的全部内容
- 示例 4:从远程 RPM 包提取文件
- 示例 5:仅提取特定类型的文件
- 示例 6:从已安装包的缓存提取源 RPM
- ⚠️注意
- 📝总结
- 📚相关命令
rpm2cpio 将 RPM 包文件转换为 cpio 归档流,再配合cpio命令即可无需安装直接提取 RPM 包中的单个文件。这是系统管理中极其实用的技巧,常用于恢复误删的系统文件或检查 RPM 包内容。
🔰简介
rpm2cpio 是 rpm 软件包的附属工具,从标准输入或指定文件读取 RPM 包,输出 cpio 格式的数据流。它不会修改系统,不依赖 RPM 数据库,甚至不需要 root 权限。
| 特性 | 说明 |
|---|---|
| 所属软件包 | rpm |
| 输入 | .rpm包文件 |
| 输出 | cpio 归档流(到 stdout) |
| 需要权限 | 普通用户即可 |
| 需要安装 | 否,直接提取 |
| 核心搭配 | cpio -idmv(解压)、cpio -t(列表) |
注意:rpm2cpio 本身只做格式转换,必须管道连接 cpio 才能提取文件。这是设计哲学——一个工具做好一件事。
📖语法
rpm2cpio 包文件.rpm|cpio 选项[模式]rpm2cpio<包文件.rpm|cpio 选项[模式]⚙️选项
rpm2cpio 本身没有独立选项,它的功能就是将 RPM 转换为 cpio 流。关键在于搭配 cpio 的选项:
| cpio 选项 | 说明 |
|---|---|
-i | 提取模式(copy-in) |
-d | 自动创建目录 |
-m | 保留文件修改时间 |
-v | 显示处理过程 |
-t | 仅列出文件名,不解压 |
--no-absolute-filenames | 去除绝对路径前缀 |
💡示例
示例 1:查看 RPM 包内容(不解压)
在不安装的情况下查看 RPM 包中包含哪些文件:
# 列出 RPM 包中的所有文件rpm2cpio nginx-1.24.0-1.el9.ngx.x86_64.rpm|cpio-t# 输出示例:./etc/logrotate.d/nginx ./etc/nginx ./etc/nginx/conf.d ./etc/nginx/conf.d/default.conf ./etc/nginx/fastcgi_params ./etc/nginx/mime.types ./etc/nginx/modules ./etc/nginx/nginx.conf ./etc/nginx/scgi_params ./etc/nginx/uwsgi_params ./usr/lib64/nginx/modules ./usr/sbin/nginx ./usr/share/doc/nginx-1.24.0 ./usr/share/doc/nginx-1.24.0/CHANGES ./usr/share/doc/nginx-1.24.0/LICENSE ./usr/share/man/man8/nginx.8.gz ./var/cache/nginx ./var/log/nginx10467blocks# 仅查看配置文件rpm2cpio nginx-1.24.0-1.el9.ngx.x86_64.rpm|cpio-t|grep-E'\.conf$|\.params$'# 输出示例:./etc/nginx/conf.d/default.conf ./etc/nginx/fastcgi_params ./etc/nginx/nginx.conf ./etc/nginx/scgi_params ./etc/nginx/uwsgi_params示例 2:提取 RPM 包中的单个文件
这是 rpm2cpio最核心的用法——从 RPM 包中提取指定文件而不安装整个包:
# 从 bash RPM 包中提取 /bin/bash 二进制文件rpm2cpio bash-5.2.15-2.el9.x86_64.rpm|cpio-idmv./bin/bash# 输出示例:./bin/bash10467blocks# 验证提取的文件file./bin/bash# 输出示例:./bin/bash: ELF64-bit LSB executable, x86-64, version1(SYSV), dynamically linked恢复误删的配置文件:
# 假设误删了 nginx.conf,从 RPM 包中恢复rpm2cpio nginx-1.24.0-1.el9.ngx.x86_64.rpm|cpio-idmv./etc/nginx/nginx.conf# 输出示例:./etc/nginx/nginx.conf10467blocks# 将恢复的文件复制到正确位置cp./etc/nginx/nginx.conf /etc/nginx/nginx.conf注意:提取的文件会按 RPM 包中的相对路径放在当前目录下。例如
./etc/nginx/nginx.conf会在当前目录创建etc/nginx/子目录。
示例 3:提取 RPM 包的全部内容
将 RPM 包的所有文件解压到当前目录:
# 完整解压 RPM 包rpm2cpio httpd-2.4.57-5.el9.x86_64.rpm|cpio-idmv# 输出示例:./etc/httpd ./etc/httpd/conf ./etc/httpd/conf.d ./etc/httpd/conf.d/README ./etc/httpd/conf.d/autoindex.conf ./etc/httpd/conf.d/userdir.conf ./etc/httpd/conf.d/welcome.conf ./etc/httpd/conf/httpd.conf ./etc/httpd/conf/magic ./etc/httpd/conf.modules.d ./etc/httpd/conf.modules.d/00-base.conf ./etc/httpd/conf.modules.d/00-dav.conf ./etc/httpd/conf.modules.d/00-lua.conf ./etc/httpd/conf.modules.d/00-mpm.conf ./etc/httpd/conf.modules.d/00-optional.conf ./etc/httpd/conf.modules.d/00-proxy.conf ./etc/httpd/conf.modules.d/00-systemd.conf ./etc/httpd/modules ./usr/lib64/httpd/modules ./usr/sbin/httpd ./usr/share/doc/httpd-2.4.57 ./usr/share/doc/httpd-2.4.57/CHANGES ./usr/share/doc/httpd-2.4.57/LICENSE ./usr/share/doc/httpd-2.4.57/README ./usr/share/man/man8/httpd.8.gz ./var/cache/httpd ./var/log/httpd ./var/www ./var/www/html10502blocks示例 4:从远程 RPM 包提取文件
结合 curl 直接从网络提取 RPM 包中的文件:
# 从远程仓库下载并提取,不保存 RPM 文件curl-sLhttps://repo.example.com/Packages/bash-5.2.15-2.el9.x86_64.rpm|rpm2cpio|cpio-idmv./bin/bash# 输出示例:./bin/bash10467blocks示例 5:仅提取特定类型的文件
使用通配符仅提取配置文件:
# 仅提取 .conf 配置文件rpm2cpio httpd-2.4.57-5.el9.x86_64.rpm|cpio-idmv"*/conf*.conf"# 输出示例:./etc/httpd/conf.d/autoindex.conf ./etc/httpd/conf.d/userdir.conf ./etc/httpd/conf.d/welcome.conf ./etc/httpd/conf/httpd.conf10502blocks仅提取 man 手册页:
rpm2cpio coreutils-9.0-6.el9.x86_64.rpm|cpio-idmv"*.gz"# 输出示例(部分):./usr/share/man/man1/ls.1.gz ./usr/share/man/man1/cp.1.gz ./usr/share/man/man1/mv.1.gz ./usr/share/man/man1/rm.1.gz ./usr/share/man/man1/cat.1.gz示例 6:从已安装包的缓存提取源 RPM
# 查找系统中的 RPM 缓存文件ls/var/cache/dnf/*/packages/*.rpm2>/dev/null|head-3# 输出示例:/var/cache/dnf/appstream-3b2c1/packages/nginx-1.24.0-1.el9.ngx.x86_64.rpm# 从缓存中提取rpm2cpio /var/cache/dnf/appstream-3b2c1/packages/nginx-1.24.0-1.el9.ngx.x86_64.rpm|cpio-t|head-5# 输出示例:./etc/logrotate.d/nginx ./etc/nginx ./etc/nginx/conf.d ./etc/nginx/conf.d/default.conf ./etc/nginx/fastcgi_params⚠️注意
- rpm2cpio 不会安装包,不会执行 %post 等安装脚本,仅提取文件
- 提取的文件路径是 RPM 内的相对路径,需要手动复制到正确位置
- 使用
--no-absolute-filenames选项可以去除路径开头的/,防止覆盖系统文件 - 不需要 root 权限,推荐在临时目录中操作
- RPM 包可以从
/var/cache/dnf/或/var/cache/yum/缓存中获取 - 也可以从安装光盘/ISO 中获取 RPM 包
📝总结
rpm2cpio 是一个"小而美"的工具,本身只做一件事——将 RPM 转为 cpio 流。但配合 cpio 命令后,它成为无需安装即可提取 RPM 文件的利器。核心用法就是rpm2cpio xxx.rpm | cpio -idmv。在恢复误删系统文件、检查包内容、提取单个配置文件等场景下,它是首选工具。
📚相关命令
cpio— cpio 归档处理工具rpm— RPM 包管理器rpmquery— RPM 包查询工具rpm2archive— 将 RPM 转为 tar 归档(较新版本)yumdownloader— 下载 RPM 包而不安装dnf download— 下载 RPM 包