Какой лучший способ проверить версию библиотеки в Ubuntu
Я уверен, что есть несколько способов сделать это, но есть ли инструмент, встроенный в 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-битного). И в моей системе это выглядит как libattr1
Пакет (в версии 1:2.4.44-2) установил общий объектный файл libattr.so, который после дальнейшего изучения находится в версии 1.1.0.