我确信有几种方法可以做到这一点,但是有没有一种内置于Ubuntu的工具,或者推荐的方法来检查你已经安装在Ubuntu服务器上的任何给定库的版本?
首先, 有时候当人们谈论图书馆的时候,他们正在谈论.deb软件包, 这些软件包提供给其他软件包的库 我们会先处理这个案子。 你听到的另一个上下文中使用的库是传统的.so 共享对象的意义。 我们会处理那一秒。
apt-cache depends <package_name>将返回一个依赖于<package name> 。 软件包不一定与库(即可链接.so文件的库)一致,但在Debian和Ubuntu库中通常打包为lib<something> 。 如果您执行dpkg -l |grep <library package name> ,则可以find包含哪个库的安装包。
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
正如你所看到的,我们的好朋友有不less图书馆与之相连。 如果我没有记错, libattr.so.1处理文件属性。 对它进行apt-file search显示它是由两个软件包ia32-libs和libattr1 (一个用于32位,一个用于64位)安装的。 在我的系统上,它看起来像libattr1软件包(在版本1:2.4.44-2)安装libattr.so共享对象文件,进一步调查是在版本1.1.0。