dpkg 可以验证已安装包中的文件吗?

dpkg 可以验证已安装包中的文件吗?

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 +0100v1.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

当然,编写类似的别名/脚本来检查来自特定包的文件应该相当简单。

相关内容