我确信有几种方法可以做到这一点,但是是否有内置于 Ubuntu 的工具或推荐的方法来检查您在 ubuntu 服务器上安装的任何给定库的版本?
答案1
首先。有时当人们谈论库时,他们指的是 .deb 包,提供库到其他包。我们先处理这种情况。你听到的另一种情况是传统的.so
共享对象意义。我们稍后再处理。
apt-cache depends <package_name>
将返回依赖的软件包列表<package name>
。软件包不一定与库(即可链接.so
文件意义上的库)一致,但在 Debian 和 Ubuntu 中,库是一般来说打包为lib<something>
。如果你执行,dpkg -l |grep <library package name>
你可以找到安装了哪个包含哪些库的包。
kelliott@mis-ke-lnx:~$ apt-cache depends perl
perl
Depends: perl-base
Depends: perl-modules
Depends: libbz2-1.0
Depends: libc6
Depends: libdb4.7
Depends: libgdbm3
Depends: zlib1g
kelliott@mis-ke-lnx:~$ dpkg -l |grep libc6
ii libc6 2.11.2-10 Embedded GNU C Library: Shared libraries
ii libc6-dev 2.11.2-10 Embedded GNU C Library: Development Libraries and Header Files
或者你也可以反过来。如果你想知道哪个包需要这个包,libwww-perl
你可以使用这个方便的小 perl 脚本来返回一个libwww-perl
反向依赖列表,这些依赖项还已安装。
#!/usr/bin/env perl
use strict;
use warnings;
use AptPkg::Cache;
my $cache = AptPkg::Cache->new;
my $pkg = $ARGV[0]
or die 'supply a package name as the first arg';
my @acrd = split /\s+/, `apt-cache rdepends $pkg`;
my $state;
for (@acrd) {
unless ( $_ eq 'Reverse' or $_ eq 'Depends:' ) {
$state = $cache->{$_}->{'CurrentState'};
print "$_\n" if $state eq 'Installed';
}
}
现在.so
共享对象文件有点不同。我喜欢使用ldd
和的组合apt-file
。假设我对 链接的对象文件感兴趣ls
:
kelliott@mis-ke-lnx:~$ ldd /bin/ls
linux-vdso.so.1 => (0x00007fff8b05d000)
libselinux.so.1 => /lib/libselinux.so.1 (0x00007fcfb7e24000)
librt.so.1 => /lib/librt.so.1 (0x00007fcfb7c1c000)
libacl.so.1 => /lib/libacl.so.1 (0x00007fcfb7a14000)
libc.so.6 => /lib/libc.so.6 (0x00007fcfb76b3000)
libdl.so.2 => /lib/libdl.so.2 (0x00007fcfb74af000)
/lib64/ld-linux-x86-64.so.2 (0x00007fcfb8057000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00007fcfb7292000)
libattr.so.1 => /lib/libattr.so.1 (0x00007fcfb708e000)
kelliott@mis-ke-lnx:~$ apt-file search libattr.so.1
ia32-libs: /lib32/libattr.so.1
ia32-libs: /lib32/libattr.so.1.1.0
libattr1: /lib/libattr.so.1
libattr1: /lib/libattr.so.1.1.0
kelliott@mis-ke-lnx:~$ dpkg -l |grep libattr1
ii libattr1 1:2.4.44-2 Extended attribute shared library
kelliott@mis-ke-lnx:~$ file /lib/libattr.so.1
/lib/libattr.so.1: symbolic link to `libattr.so.1.1.0'
kelliott@mis-ke-lnx:~$ file /lib/libattr.so.1.1.0
/lib/libattr.so.1.1.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, stripped
如您所见,我们的好朋友ls
有相当多的库链接到它。libattr.so.1
如果我没记错的话,它处理文件属性。apt-file search
对其进行检查显示它是由两个软件包安装的ia32-libs
(libattr1
一个用于 32 位,一个用于 64 位)。在我的系统上,该软件包(版本 1:2.4.44-2)似乎libattr1
安装了 libattr.so 共享对象文件,经过进一步调查,它的版本为 1.1.0。