有没有一种安全的方法来修改RPM数据库中的另一个包的条目?

时间:2013-06-20 18:11:41

标签: installation rpm rpm-spec

我遇到了this question中描述的问题,其中旧的软件包已过时,其%preun脚本以$ 1 = 0运行,从而导致不良行为。我知道这可以通过使用-e + -i来解决,如答案中所建议的那样,或者--nopreun标志,但是很难将这些信息传达给习惯于简单地使用-U的用户。

我无法修改现有的%preun脚本。在旧版的preun之后,我没有看到任何方法从新包中运行其他代码。我找不到任何方法让我的新包以编程方式阻止旧的%preun脚本执行。

是否有任何安全的方法可以访问RPM数据库并删除现有软件包的scriptlet?

2 个答案:

答案 0 :(得分:0)

否则您无法编辑rpmdb:标头受到保护 通过SHA1或数字签名进行更改。

而是使用--nopreun升级到包的固定版本 防止运行buggy脚本。

答案 1 :(得分:0)

杰夫约翰逊绝对正确,应该不能完成。但肯定可以做到。

我已经在RPM工作中进行了分发,但请注意,这是一个包含半结构化的环境,所有系统都有没有远程指针。 如果您有远程指针访问权限,请执行"删除,安装"路径和脚本。

如果你真的觉得你应该这样做,那么这些就是指针。我不打算告诉你我是怎么做到的,因为它是"工作"而不是我的分享。概念是我的: - )

首先,备份/ var / lib / rpm / Packages文件(cp /var/lib/rpm/Packages /var/tmp/Packages.bkp)。把它放一些是安全的。如果在您使用解决方案时任何其他人更改了系统,请更新备份。定期检查RPM的数量,并在每次更改或步骤后从星期日开始测试每个方向。

您需要使用db_unload和db_load命令。为了速度,你需要使用" s2p"将任何shell sed模式转换为perl。然后构建一个如下所示的管道:

db_unload /var/tmp/Packages.bkp |perl -i -e "s2p converted string" |db_load /var/tmp/Packages.new

然后,您可以尝试通过复制原始文件来测试Packages.new。手动更改后始终运行rpm --rebuilddb。如果您看到任何错误,请恢复备份并重新生成数据库。

如果您需要将其放入RPM,然后将其转换为Lua,并将其放在pretrans或posttrans scriptlet(%pretrans -p <lua>)中。选择取决于您尝试实现的顺序。 Lua解释器内置于rpm,因此即使你以某种方式调用RPM,它也会在新系统安装期间运行正常。我把我的&#34;管子包裹着#34;在lua长字符串中,并使其仅在系统已存在时执行。否则它什么都不做。如果你在思考&#34;那将永远不会发生&#34;然后退房&#34;永远不要说永远&#34;。

顺便说一下,如果搞砸了这个问题,你可以完全改变你的RPM基础,从而对系统进行管理。如果你这样做,并且没有备份或出路,那将很难了解你对自己的行为负责。只是说你被警告了!