2013-06-20 77 views
2

我遇到了this question中描述的問題,其中舊包已過時,其%preun腳本以$ 1 = 0運行,導致不良行爲。我知道這可以通過使用-e + -i來解決,正如答案中所建議的那樣,或者--nopreun標誌,但是很難將這些信息發佈給習慣於簡單使用-U的用戶。有沒有一種安全的方法來修改RPM數據庫中的另一個包的條目?

我無法在野外修改現有的%preun腳本。我看不出有什麼辦法可以在舊版本的preun之後運行其他代碼。我找不到任何方式讓我的新軟件包以編程方式阻止執行舊的%preun腳本。

是否有任何安全的方式進入RPM數據庫並刪除現有包的scriptlet?

回答

0

不,您不能編輯rpmdb:通過SHA1或數字簽名來更改標頭時不會受到 的更改。

改爲使用--nopreun 升級到軟件包的固定版本,以防止運行bug故障腳本let。

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 long字符串將我的「管道」包裹起來,並且只在系統已經存在時才執行。它不做任何事情。如果你在想「那永遠不會發生」,那麼看看「永不言敗」。

順便說一句,如果你搞砸了,你可以完全僵化你的RPM基礎,從而管理系統的未來。如果你這樣做,並且沒有備份或出路,那麼知道你對自己的行爲負責是一個很難的方法。只是說你已經受到警告!

相關問題