如何强制rpm -V验证所有文件?

3

我希望能够验证所有文件与rpm数据库的匹配情况(即所有源自rpm的文件)。

例如:当我要求rpm验证携带/ etc / hosts的软件包时,我会得到以下内容:

# rpm -Vv setup-2.8.14-16.el6.noarch
.........  c /etc/aliases
S.5....T.  c /etc/bashrc
.........  c /etc/csh.cshrc
.........  c /etc/csh.login
.........  c /etc/environment
.........  c /etc/exports
.........  c /etc/filesystems
.........  c /etc/group
.........  c /etc/gshadow
.........  c /etc/host.conf
.........  c /etc/hosts
.........  c /etc/hosts.allow
(stuff deleted)

我想查看例如 /etc/hosts 是否已更改。我该怎么做?

我的看法是应该访问http://unix.stackexchange.com/(无论如何,我会给你点赞,因为问题看起来不错)。 - gavv
2个回答

2
这似乎是两个问题:
  • 如何查看特定文件是否被修改
  • 如何检查所有软件包。
对于第一个问题,您可以使用-qf选项询问rpm哪个软件包拥有该文件。 假设使用POSIX shell,请检查/etc/hosts
rpm -V $(rpm -qf /etc/hosts) | fgrep /etc/hosts

这当然可以编写成脚本,例如:
#!/bin/sh
rpm -V $(rpm -qf $1) | fgrep $1

检查所有软件包,使用-a选项,例如:
rpm -Va

回复澄清:您在这些行中看到的 c 告诉您该文件标记有 %config 标签。此页面列出了这些字母,包括注意使用 c RPM 数据库仅记录文件的原始大小、md5sum 和所有权。%config 标签是一种解决方案,用于承认某些文件预计将由系统维护人员修改(并避免混乱的验证报告)。您有几个选择(都需要额外的工作):
  • 您可以下载二进制 RPM 包,从中提取文件并将其与安装的 RPM 进行差异比较。
  • 您可以记录原始软件包内容(我在本地使用 rcs 处理此类事情),然后进行比较。
提取软件可以使用unrpm脚本。有不止一个这个名字的脚本;这里是其中一个的链接。

抱歉,也许我的问题没有表达清楚。我的情况是我知道一个文件(例如/etc/hosts)已经被更改。当我运行rpm -Vv时,结果中没有文件的"5"。我猜测在/etc/hosts上根本没有执行md5检查。我想以一种方式运行rpm验证,以便对所有文件(包括例如/etc/hosts)执行md5检查,并且我希望看到结果显示所有已更改的文件的"5" ... 包括像/etc/hosts这样的文件。 (希望这样更清楚) - Skagen

2
一个rpm spec文件可以明确说明应该由-V验证文件的哪些方面,而配置文件(在您的输出的第二列中显示为c)通常预计会被更改,并且在更新时不会被覆盖。
您可以通过rpm -qlv轻松获取原始文件大小和所有权信息,因此您可以对相同的文件进行ls,然后进行比较。例如,
rpm=setup
rpm -ql $rpm | 
xargs ls -ld --time-style='+%b %d %Y' |
tr -s ' ' |
sort -k9 |
diff -u <(rpm -qlv $rpm |tr -s ' ' | sort -k9) -

可以显示变化(来自rpm的-前缀,现在是+)或不显示变化(前缀)。


以下是一个脚本,它获取软件包名称列表并使用--dump命令获取校验和信息(等等),在我的Fedora 22上似乎是sha256sum而不是md5sum,并将其与实际文件进行比较。尽管rpm -V有一个额外的最后字段“capabilities differ”,但此信息未在转储输出中提供。

#!/bin/bash
for pkg
do rpm -q --dump "$pkg" |
 while read path size mtime digest mode owner group isconfig isdoc rdev symlink
 do if [ "$path" = package ] # not installed
    then echo "$path $size $mtime $digest $mode"
         continue
    fi
    S=. M=. F=. D=. L=. U=. G=. T=.
    type=$(stat --format='%F' $path)
    if [ "$type" = "regular file" ]
    then if realsum=$(sha256sum <$path)
         then [ $digest != ${realsum/ -/} ] && F=5
         else F=?
         fi
    elif [ "$type" = "symbolic link" ]
    then reallink=$(readlink $path)
        [ "$symlink" != "$reallink" ] && L=L
    # elif [ "$type" = "directory" ] ...
    fi
    eval $(stat --format='s=%s u=%U g=%G t=%Y hexmode=%f' $path)
    realmode=$(printf "%07o" 0x$hexmode)
    realmode6=$(printf "%06o" 0x$hexmode)
    [ "$mode" != "$realmode" -a "$mode" != "$realmode6" ] && M=M
    [ "$size" != "$s" ] && S=S
    [ "$owner" != "$u" ] && U=U
    [ "$owner" != "$g" ] && G=G
    [ "$mtime" != "$t" ] && T=T
    flags="$S$M$F$D$L$U$G$T"
    [ "$flags" = "........" ] ||
    echo "$flags $path" # missing: P capabilities
 done
done

我添加了一个脚本来检查总和。 - meuh
如果我这样做了,我会(a)使其不依赖于bash,并且(b)倾向于重构报告,使其看起来更像rpm -V - Thomas Dickey
现在它有点像“-V”。 - meuh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接