Listar todos os comandos de um pacote Debian específico

9

Eu quero conhecer 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 compgencomando 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
Maythux
fonte

Respostas:

13

Use dpkg -L pkgnamee envie-o para um comando grep, procurando bin/e games/:

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

Se você deseja verificar todos os binários, independentemente de estarem em sua $PATHtentativa, tente esta função do bash:

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

Invoque assim:

$ 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
fonte
Pode haver bin fora bin / ou jogos /.
Maythux
dpkg -L apache2 | egrep '(bin | jogos) /' Sem resultado. Por favor, melhore sua resposta
Maythux
O @Hadi apache2pode ser um mau exemplo, porque esse pacote é um metapacote que geralmente nem é instalado em sistemas executando o Apache. O comando funciona - tente coreutils:dpkg -L coreutils | egrep '(bin|games)/'
Martin von Wittich
1
+1, muito bom. Apenas alguns comentários, você pode usar em grep -Ew 'bin|sbin|games'vez disso, egrep está obsoleto e você também pode procurar por sbin. Além disso, não há razão para usar um forloop aqui, usando um whileloop como fiz na minha resposta, significa que você não precisa se preocupar com o IFS e a divisão de palavras.
terdon
1
De 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.Além disso, você regex, corresponderá a qualquer diretório que contenha um gamesou binque incluirá /usr/share/games/, e também foosbinaffe qualquer outra coisa.
terdon
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. Analise o banco de dados do pacote

Essa é uma abordagem semelhante à @ Winny's, 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 apt-fileinstalado, você pode instalar e configurar com estes comandos:

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

O comando acima usa apt-filepara listar o conteúdo de um pacote e, em seguida, os testes do bash -f(este é um arquivo?) E -x(é executável?) E imprime o nome do arquivo se os dois testes forem aprovados.

Observe que, embora algo como o comando abaixo, você obtenha a maioria dos executáveis:

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

ele não encontrará tudo porque você também obtém executáveis ​​em locais como /optou mesmo /lib(várias udevferramentas, por exemplo). Portanto, embora o uso de -wpara combinar 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.

terdon
fonte
Os executáveis /optou /libnão devem ser chamados pelos usuários, portanto, você não deve listá-los. `apt-file -F list $ pacote | grep -E '^ (/ usr) / (s? bin | jogos) /' fornece a lista, com uma exceção: alternativas .
Gilles 'SO- stop be evil'
@ Gilles Não vejo por que não, o OP pediu comandos, se estes foram feitos para serem executados manualmente ou não, está fora de questão. Além disso, existem perfeitamente boas razões para usar algumas delas, por exemplo, /lib/udev/findkeyboardspode ser muito útil ao escrever regras do teclado udev .
terdon
/lib/udev/rule_generator.functionstambém pode ser útil. Se você começar a listar tudo o que é útil, não são apenas os executáveis ​​que você precisa listar, mas qualquer tipo de biblioteca de códigos.
Gilles 'SO- stop be evil'
2

Se você dlocateinstalou, 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 os programas executáveis, com muito poucas 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 - a partir do Debian wheezy, apenas dois: /usr/bin/mhe /usr/bin/nu-mh.

Se o pacote não estiver instalado, substitua dpkg -Lpor 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 esses métodos perdem um conjunto de programas: aqueles que são fornecidos por meio do mecanismo de alternativas . Por exemplo, apenas para o ftppacote netkit-ftpe pftpsão fornecidos, mas esse pacote realmente fornece o ftpcomando, porque /usr/bin/ftpé um link simbólico ao /etc/alternatives/ftpqual é um link simbólico a uma das ftpimplementações no sistema, potencialmente /usr/bin/netkit-ftp. O comando a seguir (que não é um exemplo de boa programação, apenas uma grande linha) lista os comandos fornecidos por um pacote por meio do mecanismo de alternativas, conforme configurado atualmente.

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ê deseja listar os comandos que podem ser fornecidos por meio de uma alternativa atualmente configurada para apontar para um pacote diferente, é necessário analisar os arquivos /var/lib/dpkg/alternatives.

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

Gilles 'SO- parar de ser mau'
fonte
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 fora do * bin /.
  2. Se você não instalou o apache2, dpkg -Lcertamente não lhe dará resultado. Por favor, tente a ferramenta apt-file (você precisa instalá-lo).
  3. O nome apache2 é um metapacote, não contém nenhum programa.
Magicloud
fonte
-1

use abaixo de um comando e substitua systemd pelo nome do pacote direcionado. este comando listará todos os comandos disponíveis com sua introdução de uma linha, respectivamente

dpkg -L systemd | grep 'sbin\|bin' | awk -F "/" '{print $NF}' | xargs man | grep ' - ' 2> /dev/null
linux.cnf
fonte