Linux 从rpm包中提取spec文件

Linux 从rpm包中提取spec文件,linux,rpm,rpmbuild,rpm-spec,Linux,Rpm,Rpmbuild,Rpm Spec,有没有办法从rpm包中提取spec文件(我只有rpm文件) 不是由 rpm --scripts -qp my-great-app-1.1.2.rpm (此语法不获取规范文件,仅获取rpm中的脚本)规范文件通常不在rpm中。它们在源rpm中。除非包装商出于某种原因(实际上没有理由这样做),否则规范文件不会存储在二进制rpm中。您可以从二进制rpm中获得的唯一信息是rpm-qi返回的信息,以及rpm-ql列出的文件。如果您需要更多,您必须找到源程序包。如果谷歌/供应商的网站未能为您提供这些

有没有办法从rpm包中提取spec文件(我只有rpm文件)

不是由

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

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

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

除非包装商出于某种原因(实际上没有理由这样做),否则规范文件不会存储在二进制rpm中。您可以从二进制rpm中获得的唯一信息是
rpm-qi
返回的信息,以及
rpm-ql
列出的文件。如果您需要更多,您必须找到源程序包。如果谷歌/供应商的网站未能为您提供这些信息,则应在“包装商”字段中提供由任何有能力的人包装的任何物品的联系信息。例如,以下是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)
$rpm--qf“{Packager}\n'-q redhat发行版
红帽公司。
$rpm--qf“{Packager}\n'-q cfengine社区
发动机组件(packager@cfengine.com)
在那里,您分别有一个网站和一个电子邮件地址,在那里您可以询问有关spec文件或srpm文件的信息。

您可以使用

yumdownloader --source < something.rpm

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

示例:

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

rpmrebuild是你的朋友。使用

rpmrebuild -e -p <rpm_file>
rpmrebuild-e-p

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

根据@RumpleStiltskin的回答,原始等级库文件可以在可提取的源rpm中找到。要获取源RPM,请运行以下操作:

yum install yum-utils # Only required if yumdownloader is not installed
yumdownloader --source <package name, like 'emacs-nox'>
yum-install-yum-utils#仅当未安装yumdownloader时才需要
yumdownloader——源代码
这将把软件包安装到当前目录。要提取它,请运行:

rpm2cpio <package name>.src.rpm | cpio -civ '*.spec'
rpm2cpio.src.rpm | cpio-civ'*.spec'
.spec
文件将位于当前目录中


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

我可以通过这个简单的命令获得我所有的.spec、source和补丁

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

现在可以更改spec、src并重建RPM或SRPM。

您确定spec文件存储在RPM中吗?当然是在一个.src.rpm中,但是对于一个普通的rpm,我一点也不确定。因此,如果我只有rpm文件可以获取规范文件,请帮助查找源rpm或该软件包的主页。我只有rpm文件而不是源rpm给我举个例子如何做到这一点,如何使用vi?我在rpm中看到了许多字符和中文单词,我无法以这种方式找到规范-:(我可以在没有规范文件的情况下重新构建rpm吗?@jon:AFAIK,不可能“构建”它。但是,我认为,通过查看二进制rpm中打包的文件,您可以只编写一个包含安装部分的规范文件。“通过查看二进制rpm中打包的文件"请解释一下?那么如何从srpm中提取它们呢?这只会获取将要安装的文件,而不是spec file.rpm-i pkg.src.rpm会将其提取到rpmbuild目录。问题不是源rpm,而是二进制rpm。如果OP有src.rpm,那么就很容易了,他不会问这个问题。看看rpmrebuild的代码,然后对其进行实际测试,它不会“提取”规范文件;它会重新生成大部分规范文件(头、日志、预/后脚本)。但是,对于重建来说,至关重要的是,它实际上不会获得%prep或%build节段;它只会将它们保留在默认值(分别为“make clean”和“make install”)。我怀疑这是因为/that/information没有存储在RPM中。因此,虽然这在大多数情况下都应该有效,但它看起来并不是万能的(尤其是对于具有复杂编译步骤的包)。:/dannysauer:当然,实际上它不是提取,因为它是对规范文件的重建(“提取”是问题)。规范不是RPM包的一部分,因此重建是获得“规范模板”的唯一方法。但在许多情况下,这可能是一个很好的起点。在过去,它有时帮助我修复二进制RPM包。这并没有回答问题。它明确指出:“我只有RPM文件”
$ rpmbuild --recompile --noclean ./SRPMS/somerpm.src.rpm