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

时间:2015-09-17 15:32:55

标签: linux rpm verify

我希望能够针对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已更改。我该怎么做?

2 个答案:

答案 0 :(得分:2)

这似乎是两个问题:

  • 如何查看特定文件是否已修改
  • 如何检查所有包裹。

对于第一个,您可以使用rpm选项询问-qf哪个包拥有一个文件。假设有一个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告诉您该文件标有rpm标记%config标记。此页面列出了这些字母,包括注意c的使用:

RPM数据库仅记录原始大小,md5sum,文件所有权。 %config标签是一种解决方法,用于确认系统维护人员应该修改某些文件(并避免使验证报告混乱)。你有几个选择(都涉及额外的工作):

  • 您可以下载二进制rpm包,从中提取文件并根据已安装的rpm进行区分
  • 您可以记录原始包装内容(我在本地使用rcs进行此类操作),并与记录的版本进行比较。

对于提取,unrpm脚本很有用。 (这个名称不止一个; here is a link一个。)

答案 1 :(得分:1)

rpm规范文件可以明确说明-V应该验证文件的哪些方面,并且配置文件(显示在输出的第2列中的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) -

可以显示更改(转义为-前缀,现在为+)或不显示(前缀)。

这是一个脚本,它获取包名称列表并使用--dump来获取 校验和信息(等),在我的Fedora 22上似乎是sha256sum而不是 一个md5sum,并将其与真实文件进行比较。虽然rpm -V有一个额外的最终字段, “功能不同”,转储输出中未提供此信息。

#!/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