如何从 RPM 包文件中提取文件
有时,我们可能想要获取 RPM 包的内容或者单个文件。
为此,我们可以使用 rpm2cpio 转换工具。
rpm2cpio 工具以 CPIO 而非 TAR 存档的形式提取源或者二进制 RPM 的内容。
rpm2cpio 输出被写入标准输出并通常通过管道传输到 cpio 命令中。
1. 列出包文件中的文件
在此示例中,我们使用 -t 选项来指示 cpio 生成由 rpm2cpio 创建的存档的“目录”。
当我们想要提取文件时,这可以更容易地获得正确的文件名和路径。
$ rpm2cpio bash-3.1-16.1.x86_64.rpm | cpio -t
请注意,“rpm -qpl”命令将文件名显示为绝对路径“/bin/bash”,但“cpio -t”输出使用“./bin/bash”相对路径名。
这非常方便,因为我们可以作为普通用户使用 rpm2cpio 来提取通常会安装到特权目录中的文件。
以下示例显示了输出的显示方式:
$ rpm2cpio bash-3.1-16.1.x86_64.rpm | cpio -t ./bin/bash ./bin/sh ./etc/skel/.bash_logout ./etc/skel/.bash_profile ./etc/skel/.bashrc ... 10510 blocks
2.从一个包文件中提取一个或者多个文件
使用 rpm2cpio 生成 CPIO 存档,并使用 cpio "-i" 开关提取所需文件:
$ rpm2cpio bash-3.1-16.1.x86_64.rpm | cpio -ivd ./bin/bash ./bin/bash 10510 blocks
$ ls -l /home/user/bin/bash total 744 -rwxr-xr-x 1 user user 753720 March 1 13:10 bash
在这种情况下,选项“-i”、“-v”和“-d”将cpio定向到:
-i 从存档中提取一个或者多个文件。
请求的文件名必须与“cpio -t”目录完全匹配,或者是类似 shell 的通配符模式。
如果目标文件已经存在,cpio 将拒绝覆盖它,除非在命令中添加“-u”开关。
-d 创建任何位于 cpio 命令中指定的文件名之前的目录。
如果目录已经存在,则可以省略“-d”开关,但如果始终指定它也无害。
-v 以 512 字节的块显示处理的任何文件的名称以及 CPIO 存档文件的大小。
请注意,此大小不是 cpio 从未直接看到的 RPM 包的大小。
如果没有给出文件名,则将提取所有 RPM 文件。
列出 RPM 包内的文件
我们可以通过执行 RPM 查询并添加“-p”开关来获取 RPM 中的文件列表:
$ rpm -q -l -p bash-3.1-16.1.x86_64.rpm /bin/bash /bin/sh /etc/skel/.bash_logout /etc/skel/.bash_profile /etc/skel/.bashrc ...
通常会安装 RPM 的文件内容。
这意味着 RPM 文件被复制到文件系统中的正确位置,以便它们可以被使用。
例如,安装 bash 二进制 RPM 会将“/bin/bash”文件放入其预期位置。
要安装 RPM,请使用“-i”或者“-U”开关:
$ rpm -ivh bash-3.1-16.1.x86_64.rpm