从 rpm 包中提取规范文件

Posted

技术标签:

【中文标题】从 rpm 包中提取规范文件【英文标题】:extract the spec file from rpm package 【发布时间】:2011-08-02 14:32:53 【问题描述】:

有没有办法(我只有 RPM 文件)

不是由

   rpm --scripts -qp my-great-app-1.1.2.rpm 

(此语法不获取规范文件,仅从 rpm 获取脚本)

【问题讨论】:

您确定规范文件存储在 RPM 中吗?在 .src.rpm 中,当然可以,但对于正常的 RPM,我完全不确定。 所以如果我只有 rpm 文件可以获取规范文件,请帮助 查找源 RPM,或该软件包的主页。 我只有 rpm 文件没有源码 给我一个例子,如何做到这一点,vi 怎么样?我在rpm中看到很多字符和中文单词,我找不到这种方式的规范-:( 【参考方案1】:

安装 rpmrebuild 并“提取”(实际上是重新创建)您的 rpm 文件或您已经安装的包的规范文件。

例子:

rpmrebuild --package --notest-install -e oracle-instantclient-basic-10.2.0.4-1.x86_64.rpm
rpmrebuild -s hercules.spec hercules

【讨论】:

查看 rpmrebuild 的代码然后实际测试它,它并没有“提取”规范文件;它会重新生成大部分规范文件(标题、日志、前/后脚本)。但是,对于重建至关重要的是,它实际上并没有得到 %prep 或 %build 部分;它只是将它们保留为默认值(分别为“make clean”和“make install”)。我怀疑这是因为 /that/ 信息没有存储在 RPM 中。因此,虽然这应该适用于最一般的情况,但它看起来并不普遍适用(尤其是对于具有复杂编译步骤的包)。 :// dannysauer:当然,实际上它不是提取,因为它是规范文件的重建(“提取”是问题)。规范不是 RPM 包的一部分,因此重建是获得“规范模板”的唯一方法。但在许多情况下,这可能是一个很好的起点。过去它有时会帮助我修复二进制 rpm 包。【参考方案2】:

spec 文件不存储在二进制 rpm 中,除非打包程序出于某种原因特别包含它(而且确实没有理由这样做)。您可以从二进制 rpm 获得的唯一信息是 rpm -qi <package> 返回的信息,以及 rpm -ql <package> 列出的文件。如果你需要更多,你必须找到源包。如果 Google / 供应商的网站无法为您提供这些信息,则应该在 Packager 字段中提供任何有能力的人打包的任何联系信息。例如,以下是 RHEL 附带的一个包和来自第三方供应商的一个包:

$ rpm --qf '%Packager\n' -q redhat-release
Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
$ rpm --qf '%Packager\n' -q cfengine-community
CFEngine AS (packager@cfengine.com)

您分别有一个网站和一个电子邮件地址,您可以在其中询问规范文件或 srpm 文件。

【讨论】:

【参考方案3】:

spec 文件通常不在 rpm 中。它们在源 rpm 中。

【讨论】:

我可以在没有规范文件的情况下再次重建 rpm 吗? @jon:AFAIK,不可能“构建”它。但是,我认为,您可以通过查看二进制 rpm 中打包的文件来编写一个仅包含安装部分的规范文件。 “通过查看打包在二进制rpm中的文件”请解释一下? 那么如何从 srpm 中提取它们?【参考方案4】:

你可以使用

yumdownloader --source < something.rpm

然后:

rpm2cpio packagename | cpio -ivd

【讨论】:

只获取将要安装的文件,而不是spec文件。 rpm -i pkg.src.rpm 会解压到rpmbuild目录 问题不在于源 rpm,而在于二进制 rpm。如果 OP 有 src.rpm 那么这很容易,他不会问这个问题。【参考方案5】:

根据@RumpleStiltskin 的回答,原始规范文件可以在可以提取的源 rpm 中找到。要获取源 rpm,请运行以下命令:

yum install yum-utils # Only required if yumdownloader is not installed
yumdownloader --source <package name, like 'emacs-nox'>

这会将包安装到当前目录。提取它运行:

rpm2cpio <package name>.src.rpm | cpio -civ '*.spec'

.spec 文件将在您的当前目录中。

如果由于某种原因无法安装 yum-utils,请查看 /etc/yum.repos.d/ 中的文件并查找引用源 rpm 存储库的部分。您可以在浏览器中输入baseurl 的值并手动搜索源包。提取.spec 仍然需要rpm2cpio

【讨论】:

【参考方案6】:

rpmrebuild 是你的朋友。使用

rpmrebuild -e -p <rpm_file>

当它在编辑器中打开规范文件时,您还可以对 rpm 规范进行更改。

【讨论】:

【参考方案7】:

我可以通过这个简单的命令获取我所有的 .spec、源代码和补丁

$ rpmbuild --recompile --noclean ./SRPMS/somerpm.src.rpm

现在可以更改规范、源代码并重新构建 RPM 或 SRPM。

【讨论】:

这不能回答问题。明确说明:“我只有 RPM 文件”

以上是关于从 rpm 包中提取规范文件的主要内容,如果未能解决你的问题,请参考以下文章

使用rpmrebuild从rpm包中提取spec文件

使用rpmrebuild从rpm包中提取spec文件

使用rpmrebuild从rpm包中提取spec文件

Linux提取RPM包文件(cpio命令)详解

RPM 规范文件 - 是不是可以动态填充规范文件变量

linux 已安装包校验rpm包中文件提取