Lista todos os comandos de um pacote Debian específico

8

Eu quero saber os comandos que um pacote Debian específico me oferece.

Por exemplo, digamos que eu instalei um pacote chamado x.deb . Este pacote certamente contém alguns comandos que eu posso usar.

Como listar esses comandos.

Eu sei que posso usar o comando compgen bash para gerar uma lista de todos os comandos disponíveis no meu sistema, mas o que eu preciso é apenas para um pacote específico.

Eu tentei as soluções:

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

Eu tentei o comando postgres

user@userPc:~$ postgres
No command 'postgres' found, did you mean:
 Command 'postgrey' from package 'postgrey' (universe)
postgres: command not found
    
por Maythux 01.04.2014 / 09:30

4 respostas

13

Use dpkg -L pkgname e canalize-o para um comando grep procurando por bin/ e games/ :

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

Se você quiser verificar todos os binários, independentemente de eles estarem no seu $PATH , tente esta função bash:

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

Invoque da seguinte forma:

$ 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...
    
por 01.04.2014 / 09:36
11

1. Use uma ferramenta projetada para o trabalho.

A maneira mais fácil e provavelmente a mais robusta é instalar dlocate :

sudo apt-get install dlocate

Você pode então executar

dlocate -lsbin package-name

Como explicado em man dlocate :

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

2. Analisar o banco de dados de pacotes

Esta é uma abordagem semelhante à do @ Winny, mas simplificada

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

Se você não tiver o apt-file instalado, poderá instalá-lo e configurá-lo com estes comandos:

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

O comando acima usa apt-file para listar o conteúdo de um pacote e depois os testes de bash -f (este é um arquivo?) e -x (é executável?) e imprime o nome do arquivo se ambos os testes forem aprovados.

Note que, apesar de algo como o comando abaixo, você obterá executáveis mais :

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

ele não encontrará tudo porque você também obtém executáveis em lugares como /opt ou mesmo /lib (várias udev tools por exemplo). Portanto, embora usar -w para corresponder palavras inteiras aumente suas chances de identificar os arquivos corretamente, analisar o caminho não é uma boa abordagem e você deve usar um dos métodos acima.

    
por 01.04.2014 / 17:18
2

Se você tem dlocate instalado, há uma maneira fácil de listar todos os comandos em um pacote instalado:

dlocate -lsbin PACKAGE-NAME

Com apenas dpkg , você pode listar os arquivos nos diretórios PATH padrão (eles são quase todos programas executáveis, com pouquíssimas exceções):

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

As exceções são alguns diretórios - do Debian wheezy, apenas dois: /usr/bin/mh e /usr/bin/nu-mh .

Se o pacote não estiver instalado, substitua dpkg -L por apt-file -F list :

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

Embora existam arquivos executáveis em outros diretórios, eles não devem ser executados diretamente, o que os torna irrelevantes aqui.

Todos estes métodos perdem um conjunto de programas: aqueles que são fornecidos através do mecanismo alternativas . Por exemplo, para o pacote ftp , apenas netkit-ftp e pftp são fornecidos, mas esse pacote realmente fornece o comando ftp , porque /usr/bin/ftp é um link simbólico para /etc/alternatives/ftp , que é um link simbólico para uma das implementações ftp no sistema, potencialmente /usr/bin/netkit-ftp . O seguinte comando (que não é um exemplo de boa programação, apenas um grande one-liner) lista os comandos fornecidos por um pacote através do mecanismo de alternativas, como atualmente configurado.

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…

Se você quiser listar os comandos que podem ser fornecidos por meio de uma alternativa que está atualmente configurada para apontar para um pacote diferente, será necessário analisar os arquivos em /var/lib/dpkg/alternatives .

Links simbólicos e arquivos de configuração que implementam os mecanismos alternativos não são registrados em pacotes, mas registrados automaticamente em postinst , o que torna difícil (e tecnicamente impossível se o script de instalação de um pacote não seguir as convenções) para consultar o alternativas fornecidas por um pacote desinstalado.

    
por 02.04.2014 / 00:46
0
  1. Normalmente, * bin / são os locais mais comuns para colocar todos os programas. Mesmo usando um link. Portanto, há muito pouca chance de você precisar se preocupar com comandos externos * bin /.
  2. Se você não instalou o apache2, dpkg -L certamente não dará resultado. Por favor, tente a ferramenta apt-file (você precisa instalá-la).
  3. O nome apache2 é um meta-pacote, não contém nenhum programa.
por 01.04.2014 / 09:54