Список всех команд определенного пакета Debian

9

Я хочу знать команды, которые мне предлагает конкретный пакет Debian.

Например, допустим, я установил пакет с именем x.deb. Этот пакет, безусловно, содержит некоторые команды, которые я могу использовать.

Как перечислить эти команды.

Я знаю, что могу использовать compgenкоманду bash для генерации списка всех доступных команд в моей системе, но мне нужно только для конкретного пакета.

Я попробовал решения:

dpkg -L postgresql-9.3 | egrep '(bin|games)/'
/usr/lib/postgresql/9.3/bin/pg_upgrade
/usr/lib/postgresql/9.3/bin/pg_ctl
/usr/lib/postgresql/9.3/bin/pg_resetxlog
/usr/lib/postgresql/9.3/bin/postgres
/usr/lib/postgresql/9.3/bin/pg_xlogdump
/usr/lib/postgresql/9.3/bin/initdb
/usr/lib/postgresql/9.3/bin/pg_controldata
/usr/lib/postgresql/9.3/bin/postmaster

Я попробовал команду postgres

user@userPc:~$ postgres
No command 'postgres' found, did you mean:
 Command 'postgrey' from package 'postgrey' (universe)
postgres: command not found
Maythux
источник

Ответы:

13

Используйте dpkg -L pkgnameи передайте его в команду grep для поиска bin/и games/:

$ dpkg -L bash | grep -E '(bin|games)/'
/bin/bash
/usr/bin/bashbug
/usr/bin/clear_console
/bin/rbash

Если вы хотите проверить все двоичные файлы независимо от того, входят ли они в ваш файл, $PATHпопробуйте эту функцию bash:

find_binaries (){
    dpkg -L "$@" | while read; do
        [ -f "$REPLY" -a -x "$REPLY" ] && echo "$REPLY"
    done
}

Вызовите так:

$ find_binaries postfix
...SNIP...
/usr/lib/postfix/postfix-files
/usr/lib/postfix/pipe
/usr/lib/postfix/proxymap
/usr/lib/postfix/local
/usr/lib/postfix/discard
...SNIP...
Winny
источник
Там может быть бен вне бен / или игры /.
Maythux
dpkg -L apache2 | egrep '(bin | games) /' Нет результатов. Пожалуйста, улучшите свой ответ
Maythux
@Hadi apache2может быть плохим примером, потому что этот пакет является метапакетом, который обычно даже не устанавливается в системах, работающих под Apache. Команда работает - попробуйте coreutils:dpkg -L coreutils | egrep '(bin|games)/'
Мартин фон Виттих
1
+1, очень мило. Просто пара комментариев, которые вы можете использовать grep -Ew 'bin|sbin|games'вместо этого, egrep устарела, и вы также можете искать sbin. Кроме того, здесь нет причин использовать forцикл, используя whileцикл, как я сделал в своем ответе, а это означает, что вам не нужно беспокоиться о IFS и разбиении слов.
Terdon
1
From man grep: Direct invocation as either egrep or fgrep is deprecated, but is provided to allow historical applications that rely on them to run unmodified.Кроме того, вы regex, будет соответствовать любой каталог, который содержит gamesили binбудет включать /usr/share/games/, а также foosbinaffи все остальное.
Terdon
11

1. Используйте инструмент, предназначенный для работы.

Самый простой и, вероятно, самый надежный способ - это установить dlocate:

sudo apt-get install dlocate

Вы можете запустить

dlocate -lsbin package-name

Как объяснено в man dlocate:

-lsbin List full path/filenames of executable files (if any) in package

2. Разобрать базу данных пакетов

Это аналогичный подход к @ Winny's, но упрощенный

apt-file -F list package | cut -d ' ' -f 2 | 
    while read file; do [[ -x $file && -f $file ]] && echo "$file"; done

Если вы не apt-fileустановили, вы можете установить и настроить его с помощью этих команд:

sudo apt-get install apt-file
sudo apt-file update

Вышеприведенная команда использует apt-fileдля вывода списка содержимого пакета, а затем тесты bash -f(это файл?) И -x(исполняемый ли он?) И выводит имя файла, если оба теста пройдены.

Обратите внимание, что хотя что-то вроде команды ниже, вы получите большинство исполняемых файлов:

apt-file -L list package | grep -Ew 'bin|sbin'

он не найдет все, потому что вы также получаете исполняемые файлы в таких местах, как /optили даже /lib(например, различные udevинструменты). Таким образом, хотя использование -wдля сопоставления целых слов увеличивает ваши шансы на правильное определение файлов, синтаксический анализ пути не является хорошим подходом, и вам следует использовать один из методов, описанных выше.

Тердон
источник
Исполняемые файлы в /optили /libне предназначены для вызова пользователями, поэтому вы не должны перечислять их. `apt-file -F list $ package | grep -E '^ (/ usr) / (s? bin | games) /' дает вам список, с одним исключением: альтернативы .
Жиль "ТАК ... перестать быть злым"
@ Жиль: Не понимаю, почему нет, ОП попросил команды, неважно, предназначались ли они для запуска вручную или нет. Кроме того, есть некоторые веские причины использовать некоторые из них, например, они /lib/udev/findkeyboardsмогут быть очень полезны при написании правил udev для клавиатуры .
Terdon
/lib/udev/rule_generator.functionsтоже может быть полезным. Если вы начнете перечислять все полезное, вам нужно будет перечислить не только исполняемые файлы, но и любую библиотеку кода.
Жиль "ТАК - прекрати быть злым"
2

Если вы dlocateустановили, есть простой способ перечислить все команды в установленном пакете:

dlocate -lsbin PACKAGE-NAME

С помощью just dpkgвы можете перечислить файлы в стандартных каталогах PATH (это почти все исполняемые программы, за очень немногими исключениями):

dpkg -L PACKAGE-NAME… | sed -n 's!^\(/s\?bin\|/usr/s\?bin\|/usr/games\)/!!p' | sort -u

Исключение составляют пара каталогов - по состоянию на Debian wheezy только два: /usr/bin/mhи /usr/bin/nu-mh.

Если пакет не установлен, замените dpkg -Lна apt-file -F list:

apt-file -F list PACKAGE-NAME… | sed -n 's!^\(/s\?bin\|/usr/s\?bin\|/usr/games\)/!!p' | sort -u

Хотя в других каталогах есть исполняемые файлы, они не предназначены для непосредственного выполнения, что делает их здесь неактуальными.

Все эти методы пропускают набор программ: те, которые предоставляются через механизм альтернатив . Например, для ftpпакета только netkit-ftpи pftpпредоставляются, но этот пакет фактически предоставляет ftpкоманду, поскольку /usr/bin/ftpявляется символической ссылкой, /etc/alternatives/ftpкоторая ftpпотенциально является символической ссылкой на одну из реализаций в системе /usr/bin/netkit-ftp. Следующая команда (которая не является примером хорошего программирования, просто большой однострочный) перечисляет команды, предоставляемые пакетом через механизм альтернатив, в соответствии с текущей настройкой.

perl -lwe 'foreach (`dpkg -L @ARGV`) {chomp; ++$p{$_}} foreach (</bin/* /sbin/* /usr/bin/* /usr/sbin/*>) {$e = readlink; next unless defined $e and $e =~ m!^/etc/alternatives/!; $t = readlink $e; print if $p{$t}}' PACKAGE_NAME…

Если вы хотите перечислить команды, которые могут быть предоставлены с помощью альтернативы, которая в настоящее время настроена для указания на другой пакет, вам необходимо проанализировать файлы в /var/lib/dpkg/alternatives.

Символьные ссылки и файлы конфигурации, которые реализуют альтернативные механизмы, не регистрируются в пакетах, а регистрируются в них автоматически postinst, что затрудняет (и фактически технически невозможно, если скрипт установки пакета не следует соглашениям) запрашивать альтернативы, предоставленные удаленным пакетом ,

Жиль "ТАК - перестань быть злым"
источник
0
  1. Обычно * bin / - это наиболее распространенные места для размещения всех программ. Даже используя ссылку. Так что очень мало шансов, что вам нужно относиться к командам вне * bin /.
  2. Если вы не установили apache2, вы dpkg -Lнаверняка не получите результат. Пожалуйста, попробуйте инструмент apt-file (вам нужно установить его).
  3. Название apache2 - это метапакет, он не содержит никаких программ.
Magicloud
источник
-1

используйте ниже одну команду и замените systemd на имя целевого пакета. эта команда выведет список всех доступных команд с их однострочным введением соответственно

dpkg -L systemd | grep 'sbin\|bin' | awk -F "/" '{print $NF}' | xargs man | grep ' - ' 2> /dev/null
linux.cnf
источник