Linux命令-rpm2cpio(RPM包文件提取工具)
rpm2cpio 将 RPM 包文件转换为 cpio 归档流,再配合 cpio 命令即可无需安装直接提取 RPM 包中的单个文件。这是系统管理中极其实用的技巧,常用于恢复误删的系统文件或检查 RPM 包内容。
🔰简介
rpm2cpio 是 rpm 软件包的附属工具,从标准输入或指定文件读取 RPM 包,输出 cpio 格式的数据流。它不会修改系统,不依赖 RPM 数据库,甚至不需要 root 权限。
| 特性 | 说明 |
|---|---|
| 所属软件包 | rpm |
| 输入 | .rpm 包文件 |
| 输出 | cpio 归档流(到 stdout) |
| 需要权限 | 普通用户即可 |
| 需要安装 | 否,直接提取 |
| 核心搭配 | cpio -idmv(解压)、cpio -t(列表) |
注意:rpm2cpio 本身只做格式转换,必须管道连接 cpio 才能提取文件。这是设计哲学------一个工具做好一件事。
📖语法
bash
rpm2cpio 包文件.rpm | cpio 选项 [模式]
rpm2cpio < 包文件.rpm | cpio 选项 [模式]
⚙️选项
rpm2cpio 本身没有独立选项,它的功能就是将 RPM 转换为 cpio 流。关键在于搭配 cpio 的选项:
| cpio 选项 | 说明 |
|---|---|
-i |
提取模式(copy-in) |
-d |
自动创建目录 |
-m |
保留文件修改时间 |
-v |
显示处理过程 |
-t |
仅列出文件名,不解压 |
--no-absolute-filenames |
去除绝对路径前缀 |
💡示例
示例 1:查看 RPM 包内容(不解压)
在不安装的情况下查看 RPM 包中包含哪些文件:
bash
# 列出 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/nginx
10467 blocks
bash
# 仅查看配置文件
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
# 从 bash RPM 包中提取 /bin/bash 二进制文件
rpm2cpio bash-5.2.15-2.el9.x86_64.rpm | cpio -idmv ./bin/bash
# 输出示例:
./bin/bash
10467 blocks
# 验证提取的文件
file ./bin/bash
# 输出示例:
./bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked
恢复误删的配置文件:
bash
# 假设误删了 nginx.conf,从 RPM 包中恢复
rpm2cpio nginx-1.24.0-1.el9.ngx.x86_64.rpm | cpio -idmv ./etc/nginx/nginx.conf
# 输出示例:
./etc/nginx/nginx.conf
10467 blocks
# 将恢复的文件复制到正确位置
cp ./etc/nginx/nginx.conf /etc/nginx/nginx.conf
注意:提取的文件会按 RPM 包中的相对路径放在当前目录下。例如
./etc/nginx/nginx.conf会在当前目录创建etc/nginx/子目录。
示例 3:提取 RPM 包的全部内容
将 RPM 包的所有文件解压到当前目录:
bash
# 完整解压 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/html
10502 blocks
示例 4:从远程 RPM 包提取文件
结合 curl 直接从网络提取 RPM 包中的文件:
bash
# 从远程仓库下载并提取,不保存 RPM 文件
curl -sL https://repo.example.com/Packages/bash-5.2.15-2.el9.x86_64.rpm | rpm2cpio | cpio -idmv ./bin/bash
# 输出示例:
./bin/bash
10467 blocks
示例 5:仅提取特定类型的文件
使用通配符仅提取配置文件:
bash
# 仅提取 .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.conf
10502 blocks
仅提取 man 手册页:
bash
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
bash
# 查找系统中的 RPM 缓存文件
ls /var/cache/dnf/*/packages/*.rpm 2>/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 包