Listar todos los comandos de un paquete Debian específico

9

Quiero saber los comandos que me ofrece un paquete específico de Debian.

Por ejemplo, digamos que instalé un paquete llamado x.deb. Este paquete seguramente contiene algunos comandos que puedo usar.

Cómo enumerar estos comandos.

Sé que puedo usar el compgencomando bash para generar una lista de todos los comandos disponibles en mi sistema, pero lo que necesito es solo un paquete específico.

Probé las soluciones:

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

Probé el comando postgres

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

Respuestas:

13

Úselo dpkg -L pkgnamey canalícelo a un comando grep buscando bin/y games/:

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

Si desea verificar todos los binarios, independientemente de si están en su $PATHprueba, pruebe esta función bash:

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

Invocar así:

$ 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
fuente
Podría haber un contenedor fuera del contenedor / o juegos /.
Maythux 01 de
dpkg -L apache2 | egrep '(bin | juegos) /' Sin resultado. Mejore su respuesta
Maythux
@Hadi apache2puede ser un mal ejemplo porque ese paquete es un metapaquete que generalmente ni siquiera está instalado en sistemas que ejecutan Apache. El comando funciona - intente coreutils:dpkg -L coreutils | egrep '(bin|games)/'
Martin von Wittich
1
+1, muy lindo. Solo un par de comentarios, es posible que desee usarlos grep -Ew 'bin|sbin|games', egrep está en desuso y también puede buscar sbin. Además, no hay ninguna razón para usar un forbucle aquí, usar un whilebucle como lo hice en mi respuesta en su lugar, significa que no necesita preocuparse por IFS y la división de palabras.
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.Además, regex, coincidirá con cualquier directorio que contenga gameso binque incluirá /usr/share/games/, y también foosbinaffy cualquier otra cosa.
terdon
11

1. Use una herramienta diseñada para el trabajo.

La forma más fácil y probablemente la más robusta es instalar dlocate:

sudo apt-get install dlocate

Entonces puedes correr

dlocate -lsbin package-name

Como se explica en man dlocate:

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

2. Analice la base de datos del paquete

Este es un enfoque similar al de @ Winny pero simplificado

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

Si no lo ha apt-fileinstalado, puede instalarlo y configurarlo con estos comandos:

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

El comando anterior usa apt-filepara enumerar el contenido de un paquete y luego las pruebas de bash -f(¿es esto un archivo?) Y -x(¿es ejecutable?) E imprime el nombre del archivo si se pasan ambas pruebas.

Tenga en cuenta que, si bien algo como el siguiente comando obtendrá la mayoría de los ejecutables:

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

no encontrará todo porque también obtienes ejecutables en lugares como /opto incluso /lib(varias udevherramientas, por ejemplo). Por lo tanto, si bien usar las -wpalabras completas para unirlas aumenta sus posibilidades de identificar los archivos correctamente, analizar la ruta no es un buen enfoque y, en su lugar, debe usar uno de los métodos anteriores.

terdon
fuente
Los ejecutables en /opto /libno están destinados a ser invocados por los usuarios, por lo que no debe enumerarlos. `apt-file -F list $ package | grep -E '^ (/ usr) / (s? bin | games) /' le da la lista, con una excepción: alternativas .
Gilles 'SO- deja de ser malvado'
@Gilles No veo por qué no, el OP solicitó comandos, si estos estaban destinados a ejecutarse manualmente o no, es algo que no importa. Además, hay razones perfectamente buenas para usar algunas de ellas, por ejemplo, /lib/udev/findkeyboardspuede ser muy útil al escribir reglas de udev en el teclado .
terdon
/lib/udev/rule_generator.functionsPuede ser útil también. Si comienzas a enumerar todo lo que es útil, no solo debes ejecutar los ejecutables, sino cualquier tipo de biblioteca de códigos.
Gilles 'SO- deja de ser malvado'
2

Si lo ha dlocateinstalado, hay una manera fácil de enumerar todos los comandos en un paquete instalado:

dlocate -lsbin PACKAGE-NAME

Con solo dpkg, puede enumerar los archivos en los directorios PATH estándar (son casi todos programas ejecutables, con muy pocas excepciones):

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

Las excepciones son un par de directorios, a partir de Debian wheezy, solo dos: /usr/bin/mhy /usr/bin/nu-mh.

Si el paquete no está instalado, reemplácelo 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

Si bien hay archivos ejecutables en otros directorios, no están destinados a ejecutarse directamente, lo que los hace irrelevantes aquí.

Todos estos métodos pierden un conjunto de programas: los que se proporcionan a través del mecanismo de alternativas . Por ejemplo, para el ftppaquete, solo netkit-ftpy pftpse proporcionan, pero este paquete en realidad proporciona el ftpcomando, porque /usr/bin/ftpes un enlace simbólico al /etc/alternatives/ftpcual es un enlace simbólico a una de las ftpimplementaciones en el sistema, potencialmente /usr/bin/netkit-ftp. El siguiente comando (que no es un ejemplo de buena programación, solo una gran línea) enumera los comandos proporcionados por un paquete a través del mecanismo de alternativas, como está configurado actualmente.

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…

Si desea enumerar los comandos que podrían proporcionarse a través de una alternativa que actualmente está configurada para apuntar a un paquete diferente, debe analizar los archivos /var/lib/dpkg/alternatives.

Los enlaces simbólicos y los archivos de configuración que implementan los mecanismos alternativos no se registran en paquetes sino que se registran automáticamente postinst, lo que dificulta (y de hecho técnicamente imposible si el script de instalación de un paquete no sigue las convenciones) consultar las alternativas proporcionadas por un paquete desinstalado .

Gilles 'SO- deja de ser malvado'
fuente
0
  1. Normalmente, * bin / son los lugares más comunes para colocar todos los programas. Incluso usando un enlace. Por lo tanto, hay muy pocas posibilidades de que deba preocuparse por comandos fuera de * bin /.
  2. Si no ha instalado apache2, dpkg -Lseguramente no le dará resultado. Intente con la herramienta apt-file (necesita instalarla).
  3. El nombre apache2 es un metapaquete, no contiene ningún programa.
Magicloud
fuente
-1

use debajo de un comando y reemplace systemd con su nombre de paquete específico. este comando enumerará todos los comandos disponibles con su introducción de una línea respectivamente

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