Rpm

如何以程式方式確定安裝的最高版本核心 RPM?

  • October 21, 2021

我想要編寫的腳本類似於以下內容:

if [ uname -r is not == highest version of kernel RPM installed ]
then
 echo "You need to reboot to use the latest kernel"
fi

問題是,如果輸出rpm -q kernel類似於:

kernel-2.6.32-358.10.2.el6.x86_64
kernel-2.6.32-358.6.1.el6.x86_64

…我如何確定哪個更高?我知道一個簡單的字元串排序是不可靠的(在這個例子中它會倒退)。是否有 rpm 的快捷方式,還是我必須解析所有內容並自己進行比較?

TL; 博士

第三次嘗試確實有效!我將留下前 2 次嘗試,以便將來可能遇到此問答的其他人希望能夠深入了解解析 RPM 版本資訊並確定其血統是多麼重要的問題,首先,其次,等等

嘗試#1(OP說沒用)

此命令將對輸出進行排序並按版本順序為您提供它們:

$ rpm -q kernel --queryformat "%{VERSION} %{RELEASE}\n"|sort -n
2.6.18 238.12.1.el5
2.6.18 238.19.1.el5
2.6.18 274.12.1.el5
2.6.18 308.8.2.el5

**為什麼它不起作用:**天真的人會認為您可以使用sort命令的某些變體來執行此任務,但是對於給定的 RPM,實際版本資訊的格式存在足夠多的可變性和不一致,它只是不是’ t 完成任務。

嘗試#2(OP說沒有用)

$ rpm -q --last kernel | head -n 1 | cut -d' ' -f1
kernel-2.6.35.14-106.fc14

**為什麼它不起作用:**我非常希望這種方法能夠產生 OP 正在尋找的結果,但是正如@Joel 在評論中指出的那樣,這個問題是--last開關只是返回按以下方式排序的結果RPM 的安裝日期。

嘗試#3

這個肯定會完成這項工作。我找到了一套名為 RPM Development Tools 的工具。該套件中有 2 個工具可以讓您確定一個 RPM 版本是比另一個版本新還是舊。

如果尚未安裝 RPM,您可以執行以下操作:

yum install rpmdevtools

第一個有用的工具叫做rpmdev-vercmp. 該工具可以比較 RPM 的 2 個名稱並告訴您哪個更新。例如:

$ rpmdev-vercmp kernel-2.6.35.14-100.fc14.x86_64 kernel-2.6.35.14-103.fc14.x86_64
0:kernel-2.6.35.14-103.fc14.x86_64 is newer

在找到這個之後,我準備好編寫一個 shell 腳本,但後來意識到,我很懶,所以我又戳了幾分鐘,在套件中找到了另一個名為rpmdev-sort.

這個工具是付費的。您可以按如下方式使用它:

$ rpm -q kernel | rpmdev-sort 
kernel-2.6.35.14-100.fc14.x86_64
kernel-2.6.35.14-103.fc14.x86_64
kernel-2.6.35.14-106.fc14.x86_64

RPM 開發工具中有很多工具可能值得其他人看看,所以我在這裡列出它們以供將來參考。

$ rpm -q --queryformat '[%{NAME} %{FILEMODES:perms} %{FILENAMES}\n]' rpmdevtools \
   | grep -E "^.* -..x..x..x " \
   | awk '{print $3}'          \
   | sed 's#/usr/bin/##'       \
   | paste - - -               \
   | column -t

annotate-output   checkbashisms    licensecheck
manpage-alert     rpmargs          rpmdev-bumpspec
rpmdev-checksig   rpmdev-cksum     rpmdev-diff
rpmdev-extract    rpmdev-md5       rpmdev-newinit
rpmdev-newspec    rpmdev-packager  rpmdev-rmdevelrpms
rpmdev-setuptree  rpmdev-sha1      rpmdev-sha224
rpmdev-sha256     rpmdev-sha384    rpmdev-sha512
rpmdev-sort       rpmdev-sum       rpmdev-vercmp
rpmdev-wipetree   rpmelfsym        rpmfile
rpminfo           rpmls            rpmpeek
rpmsodiff         rpmsoname        spectool

#3 的替代方案

評論中提到的 OP 的替代方法是使用sort -V. 那是資本-V。我也從來沒有聽說過這個開關。從sort手冊頁:

-V, --version-sort
      natural sort of (version) numbers within text

事實證明sort確實提供了對版本號進行排序的工具,因此您也可以像這樣執行排序:

$ rpm -q kernel | sort -V
kernel-2.6.35.14-100.fc14.x86_64
kernel-2.6.35.14-103.fc14.x86_64
kernel-2.6.35.14-106.fc14.x86_64

引用自:https://unix.stackexchange.com/questions/76597