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


30

使用“ rpm -qV openssh-server我”将获得与默认值相比已更改的文件列表。

~$ rpm -qV openssh-server
S.?....T.  c /etc/ssh/sshd_config
~$ 

可以dpkg在Ubuntu做?

Answers:


21

我不这么认为,在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

md5sums省略了配置文件(/ etc中的文件),因为您需要更改这些文件。
psusi 2011年

是的,例如,文件/ etc / ssh / sshd_config是由脚本生成的。在CentOS下,尽管默认配置文件确实具有md5sums。
user9517支持GoFundMonica11 2011年

5
配置文件的md5校验和存储在/ var / lib / dpkg / status中“ dpkg -V”将验证系统上所有文件(包括conf文件)的校验和。
贝恩2014年

25

与dpkg / 1.17.2中一样,--verify根据此debian错误报告,它实现了options 。

请注意,这是对dpkg的相对较新的更改。Date: Thu, 05 Dec 2013 04:56:31 +0100dpkg v1.17.2软件包中的一行显示了这一点。

这是--verifydpkg手册页中引用的操作的简要说明。

   -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验证系统上安装的每个Packge。


聚苯乙烯

比如说dpkg --verify bash,在我的机器上运行给了我类似的东西。(我正在运行dpkg / 1.17.5)

??5?????? c /etc/bash.bashrc
??5?????? c /etc/skel/.bashrc

似乎.deb软件包仅包含md5sums元数据用于验证。


这些行是什么意思???5?????? c...
rubo77

@ rubo77有关加密格式,请参见ftp.rpm.org/max-rpm/s1-rpm-verify-output.html
pallxk

好的,这??5??????意味着:MD5校验和不同,并且c =“它是一个配置文件”
rubo77

如果您只想警告已修改的软件包(而不是修改的配置文件),请使用sudo dpkg -V | grep -v '??5?????? c'
rubo77


2

通常,我会列出要验证的文件。
因此,这是一个简单的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

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



2

我使用此命令检查所有软件包:
dpkg -l | awk {'print $2'} | xargs | debsums | grep -v 'OK'

您应该需要安装debsumbs,gawk和findutils软件包。


我添加了一些错误(尽管以root身份):debsums: can't open fwupd file /var/lib/polkit-1/localauthority/10-vendor.d/fwupd.pkla (Permission denied) debsums: can't open geoclue-2.0 file /var/lib/polkit-1/localauthority/10-vendor.d/geoclue-2.0.pkla (Permission denied)
rubo77
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.