Linux命令-rpm2cpio(RPM包文件提取工具)

Linux命令-rpm2cpio(RPM包文件提取工具)

    • 🔰简介
    • 📖语法
    • ⚙️选项
    • 💡示例
      • [示例 1:查看 RPM 包内容(不解压)](#示例 1:查看 RPM 包内容(不解压))
      • [示例 2:提取 RPM 包中的单个文件](#示例 2:提取 RPM 包中的单个文件)
      • [示例 3:提取 RPM 包的全部内容](#示例 3:提取 RPM 包的全部内容)
      • [示例 4:从远程 RPM 包提取文件](#示例 4:从远程 RPM 包提取文件)
      • [示例 5:仅提取特定类型的文件](#示例 5:仅提取特定类型的文件)
      • [示例 6:从已安装包的缓存提取源 RPM](#示例 6:从已安装包的缓存提取源 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 包
相关推荐
Amy187021118231 小时前
告别“爬楼抄表”时代:电梯计量自动化改造,让每一度电都“开口说话”
运维·自动化
dadaobusi1 小时前
在 Buildroot 中为 RISC-V 64 架构集成 numactl
运维·服务器
weixin_307779132 小时前
Linux下Docker Compose里运行PostgreSQL数据库故障诊断Shell脚本
linux·运维·数据库·docker·postgresql
AI创界者2 小时前
安全测试环境搭建:在 Kali Linux 中部署与配置开源 WebShell 管理工具 AntSword(蚁剑)
linux·运维·安全
猪头少年不会遇见算法学姐2 小时前
Makefile快速上手笔记
linux·学习
qiu_lovejun9983 小时前
linux安装docker和redis和rabbitmq和nginx和rocketmq和kafka
linux·redis·docker·kafka·rabbitmq·rocketmq
运维大师3 小时前
【Linux运维极简教程】04-进程与服务管理
linux·运维
keke.shengfengpolang3 小时前
自动化考什么证书对就业有帮助?
运维·自动化
javajenius3 小时前
Masslynx 4.1安装包免费下载及详细安装教程
java·服务器·前端·其他
源码学社3 小时前
Spug 3.0 Ubuntu 22.04 Docker 部署文档
linux·ubuntu·docker·windows安装·spug