我rpm -qV openssh-server
将获得与默认值相比已更改的文件列表。
~$ rpm -qV openssh-server
S.?....T. c /etc/ssh/sshd_config
~$
在 Ubuntu 上可以dpkg
做同样的事情吗?
答案1
我不这么认为,在 Ubuntu 中,md5 校验和仅针对某些文件进行存储。对于任何给定的包,可以在以下位置找到具有校验和的文件列表:
/var/lib/dpkg/info/<package>.md5sums
例如
/var/lib/dpkg/info/openssh-server.md5sums
这些通常不包含软件包安装的文件的完整列表,例如 openssh-server.md5sums
bb5096cf79a43b479a179c770eae86d8 usr/lib/openssh/sftp-server
42da5b1c2de18ec8ef4f20079a601f28 usr/sbin/sshd
8c5592e0d522fa0f8f55f3c104479ef5 usr/share/lintian/overrides/openssh-server
cfcb67f58bcd1edcaa5a770863e49304 usr/share/man/man5/sshd_config.5.gz
71a51cbb514da3044b277e05a3ceaf0b usr/share/man/man8/sshd.8.gz
222d4da61fcb3c65b4e6e83944752f20 usr/share/man/man8/sftp-server.8.gz
您可以使用 debsums 命令(sudo apt-get install debsums)检查具有 md5 签名的文件
debsums openssh-server
/usr/lib/openssh/sftp-server OK
/usr/sbin/sshd OK
/usr/share/lintian/overrides/openssh-server OK
/usr/share/man/man5/sshd_config.5.gz OK
/usr/share/man/man8/sshd.8.gz OK
/usr/share/man/man8/sftp-server.8.gz OK
答案2
与 dpkg/1.17.2 一样,它实现了--verify
选项,根据这个Debian 错误报告。
请注意,这是 dpkg 的一个相对较新的变化。dpkg Date: Thu, 05 Dec 2013 04:56:31 +0100
v1.17.2 包中的行显示了这一点。
--verify
这里引用了dpkg 手册页中对操作的简单描述。
-V, --verify [package-name...] Verifies the integrity of package-name or all packages if omit‐ ted, by comparing information from the installed paths with the database metadata. The output format is selectable with the --verify-format option, which by default uses the rpm format, but that might change in the future, and as such programs parsing this command output should be explicit about the format they expect.
因此,您可以使用类似的语法来yum
执行验证,并在rpm 格式。 例如:
dpkg --verify openssh-server
或者仅用来dpkg --verify
验证系统上安装的每个包。
附言
在我的计算机上运行dpkg --verify bash
,得到如下结果。(我正在运行 dpkg/1.17.5)
??5?????? c /etc/bash.bashrc
??5?????? c /etc/skel/.bashrc
看起来 .deb 包只包含用于验证的 md5sums 元数据。
答案3
您可以检查一下工具 debsums。
# apt-cache search debsums
debsums - tool for verification of installed package files against MD5 checksums
答案4
通常我会有一个要验证的文件列表。
下面是一个简单的 bash 函数,它或多或少可以满足您的要求:
dpkg-verify() {
exitcode=0
for file in $*; do
pkg=`dpkg -S "$file" | cut -d: -f 1`
hashfile="/var/lib/dpkg/info/$pkg.md5sums"
if [ -s "$hashfile" ]; then
rfile=`echo "$file" | cut -d/ -f 2-`
phash=`grep -E "$rfile\$" "$hashfile" | cut -d\ -f 1`
hash=`md5sum "$file" | cut -d\ -f 1`
if [ "$hash" = "$phash" ]; then
echo "$file: ok"
else
echo "$file: CHANGED"
exitcode=1
fi
else
echo "$file: UNKNOWN"
exitcode=1
fi
done
return $exitcode
}
使用方式如下:
dpkg-verify /bin/ls /usr/bin/ld
我的环境上的输出:
/bin/ls: ok
/usr/bin/ld: UNKNOWN
当然,编写类似的别名/脚本来检查来自特定包的文件应该相当简单。