2

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

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

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

4

2 回答 2

0

不,您不能编辑 rpmdb:标头受到 SHA1 或数字签名的保护,不会被更改。

而是使用 --nopreun 升级到包的固定版本,以防止运行有问题的脚本 let。

于 2014-09-15T10:42:54.080 回答
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

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

如果您需要将其放入 RPM 中,则将其转换为 Lua,并将其放入 pretrans 或 posttrans scriptlet ( %pretrans -p <lua>)。选择取决于您要达到的顺序。Lua 解释器是内置在 rpm 中的,因此即使您的 RPM 以某种方式被调用,它也会在新系统安装期间正常运行。我将我的“管道”包裹在一个 lua 长字符串中,并使其仅在系统已经存在时才执行。否则它什么也不做。如果您认为“这永远不会发生”,请查看“永不言败”。

顺便说一句,如果你搞砸了,你可以完全加强你的 RPM 基础,从而对系统进行未来的管理。如果你这样做了,并且没有后援或出路,那么很难知道你对自己的行为负责。只是说你被警告了!

于 2015-11-12T13:10:57.117 回答