如何强制 rpm -V 验证所有文件?
How do I force rpm -V to verify ALL files?
我希望能够根据 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 已更改。我该怎么做?
这好像是两个问题:
- 如何查看特定文件是否被修改
- 如何查看所有包。
首先,您可以使用 -qf
选项询问 rpm
哪个包拥有文件。假设 POSIX shell,检查 /etc/hosts
:
rpm -V $(rpm -qf /etc/hosts) | fgrep /etc/hosts
当然可以写成脚本,例如
#!/bin/sh
rpm -V $(rpm -qf ) | fgrep
要检查所有包,请使用 -a
选项,例如,
rpm -Va
回复澄清:您在行中看到的 c
告诉您该文件标有 rpm 标签 %config
标签。此页面列出了字母,包括注意使用 c
:
RPM 数据库只记录文件的原始大小、md5sum、所有权。 %config
标签是一种解决方法,用于确认某些文件预计将由系统维护人员修改(并避免使验证报告混乱)。您有几个选择(都涉及额外的工作):
- 您可以下载二进制 rpm 包,从中提取文件并将它们与安装的 rpm 进行比较
- 你可以录制原包内容(我本地用rcs这种东西),和录制的版本对比
对于提取,unrpm
脚本很有用。 (这个名字不止一个;here is a link对一个)。
rpm 规范文件可以明确说明文件的哪些方面应该由 -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 的前缀,+
现在)或不显示(</code> 前缀)。</p>
<hr>
<p>这是一个获取包名列表并使用 <code>--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
我希望能够根据 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 已更改。我该怎么做?
这好像是两个问题:
- 如何查看特定文件是否被修改
- 如何查看所有包。
首先,您可以使用 -qf
选项询问 rpm
哪个包拥有文件。假设 POSIX shell,检查 /etc/hosts
:
rpm -V $(rpm -qf /etc/hosts) | fgrep /etc/hosts
当然可以写成脚本,例如
#!/bin/sh
rpm -V $(rpm -qf ) | fgrep
要检查所有包,请使用 -a
选项,例如,
rpm -Va
回复澄清:您在行中看到的 c
告诉您该文件标有 rpm 标签 %config
标签。此页面列出了字母,包括注意使用 c
:
RPM 数据库只记录文件的原始大小、md5sum、所有权。 %config
标签是一种解决方法,用于确认某些文件预计将由系统维护人员修改(并避免使验证报告混乱)。您有几个选择(都涉及额外的工作):
- 您可以下载二进制 rpm 包,从中提取文件并将它们与安装的 rpm 进行比较
- 你可以录制原包内容(我本地用rcs这种东西),和录制的版本对比
对于提取,unrpm
脚本很有用。 (这个名字不止一个;here is a link对一个)。
rpm 规范文件可以明确说明文件的哪些方面应该由 -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 的前缀,+
现在)或不显示(</code> 前缀)。</p>
<hr>
<p>这是一个获取包名列表并使用 <code>--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