我遇到了this question中描述的问题,其中旧的软件包已过时,其%preun脚本以$ 1 = 0运行,从而导致不良行为。我知道这可以通过使用-e + -i来解决,如答案中所建议的那样,或者--nopreun标志,但是很难将这些信息传达给习惯于简单地使用-U的用户。
我无法修改现有的%preun脚本。在旧版的preun之后,我没有看到任何方法从新包中运行其他代码。我找不到任何方法让我的新包以编程方式阻止旧的%preun脚本执行。
是否有任何安全的方法可以访问RPM数据库并删除现有软件包的scriptlet?
答案 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;。