Liste toutes les commandes d'un paquet Debian spécifique

9

Je veux connaître les commandes qu'un paquet Debian spécifique m'offre.

Par exemple, disons que j'ai installé un package appelé x.deb. Ce paquet contient sûrement quelques commandes que je peux utiliser.

Comment lister ces commandes.

Je sais que je peux utiliser la compgencommande bash pour générer la liste de toutes les commandes disponibles dans mon système, mais ce dont j'ai besoin est juste pour un package spécifique.

J'ai essayé les solutions:

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

J'ai essayé la commande postgres

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

Réponses:

13

Utilisez-le dpkg -L pkgnameet dirigez-le vers une commande grep recherchant bin/et games/:

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

Si vous souhaitez vérifier tous les binaires, peu importe s'ils se trouvent dans votre, $PATHessayez cette fonction bash:

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

Invoquez ainsi:

$ 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
la source
Il pourrait y avoir un bac à l'extérieur du bac / ou des jeux /.
Maythux
dpkg -L apache2 | egrep '(bin | games) /' Aucun résultat. Veuillez améliorer votre réponse
Maythux
@Hadi apache2peut être un mauvais exemple car ce package est un métapaquet qui n'est généralement pas même installé sur les systèmes exécutant Apache. La commande fonctionne - essayez coreutils:dpkg -L coreutils | egrep '(bin|games)/'
Martin von Wittich
1
+1, très agréable. Juste quelques commentaires, vous voudrez peut-être utiliser à la grep -Ew 'bin|sbin|games'place, egrep est obsolète et vous pouvez également rechercher sbin. De plus, il n'y a aucune raison d'utiliser une forboucle ici, en utilisant une whileboucle comme je l'ai fait dans ma réponse, cela signifie que vous n'avez pas à vous soucier de l'IFS et du fractionnement de mots.
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.Aussi, vous regex, correspondra à tout répertoire qui contient gamesou binqui inclura /usr/share/games/, et aussi foosbinaffet quoi que ce soit d'autre.
terdon
11

1. Utilisez un outil conçu pour le travail.

Le moyen le plus simple et probablement le plus robuste est d'installer dlocate:

sudo apt-get install dlocate

Vous pouvez ensuite exécuter

dlocate -lsbin package-name

Comme expliqué dans man dlocate:

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

2. Analyser la base de données des packages

Il s'agit d'une approche similaire à celle de @ Winny mais simplifiée

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

Si vous ne l'avez pas apt-fileinstallé, vous pouvez l'installer et le configurer avec ces commandes:

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

La commande ci-dessus utilise apt-filepour lister le contenu d'un paquet puis les tests de bash -f(est-ce un fichier?) Et -x(est-il exécutable?) Et affiche le nom du fichier si les deux tests sont réussis.

Notez que bien que quelque chose comme la commande ci-dessous vous obtienne la plupart des exécutables:

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

il ne trouvera pas tout car vous obtenez également des exécutables dans des endroits comme /optou même /lib(divers udevoutils par exemple). Ainsi, tout en utilisant le -wpour faire correspondre des mots entiers augmente vos chances d'identifier correctement les fichiers, l'analyse du chemin n'est pas une bonne approche et vous devez plutôt utiliser l'une des méthodes ci-dessus.

terdon
la source
Les exécutables dans /optou /libne sont pas destinés à être invoqués par les utilisateurs, vous ne devez donc pas les répertorier. `apt-file -F list $ package | grep -E '^ (/ usr) / (s? bin | games) /' vous donne la liste, à une exception près: les alternatives .
Gilles 'SO- arrête d'être méchant'
@Gilles Je ne vois pas pourquoi, l'OP a demandé des commandes, que celles-ci soient destinées à être exécutées manuellement ou non. De plus, il y a de très bonnes raisons d'utiliser certains d'entre eux, par exemple /lib/udev/findkeyboardspeut être très utile lors de l' écriture de règles udev de clavier .
terdon
/lib/udev/rule_generator.functionspeut aussi être utile. Si vous commencez à répertorier tout ce qui est utile, ce n'est pas seulement les exécutables que vous devez répertorier, mais tout type de bibliothèque de code.
Gilles 'SO- arrête d'être méchant'
2

Si tu as dlocate installé, il existe un moyen simple de répertorier toutes les commandes d'un package installé:

dlocate -lsbin PACKAGE-NAME

Avec juste dpkg, vous pouvez lister les fichiers dans les répertoires PATH standard (ce sont presque tous des programmes exécutables, à quelques exceptions près):

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

Les exceptions sont quelques répertoires - à partir de Debian Wheezy, seulement deux: /usr/bin/mhet /usr/bin/nu-mh.

Si le package n'est pas installé, remplacez dpkg -L par apt-file -F list:

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

Bien qu'il existe des fichiers exécutables dans d'autres répertoires, ils ne sont pas destinés à être exécutés directement, ce qui les rend non pertinents ici.

Ces méthodes manquent toutes un ensemble de programmes: ceux qui sont fournis via le mécanisme alternatif . Par exemple, pour le ftppackage, seuls netkit-ftpet pftpsont fournis, mais ce package fournit en fait la ftpcommande, car il /usr/bin/ftps'agit d'un lien symbolique vers /etc/alternatives/ftplequel est ftppotentiellement un lien symbolique vers l'une des implémentations du système /usr/bin/netkit-ftp. La commande suivante (qui n'est pas un exemple de bonne programmation, juste un gros one-liner) répertorie les commandes fournies par un package via le mécanisme alternatif, tel qu'il est actuellement configuré.

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 vous souhaitez répertorier les commandes qui pourraient être fournies via une alternative actuellement configurée pour pointer vers un autre package, vous devez analyser les fichiers dans /var/lib/dpkg/alternatives .

Les liens symboliques et les fichiers de configuration qui implémentent les mécanismes alternatifs ne sont pas enregistrés dans les packages mais enregistrés automatiquement dans postinst, ce qui rend difficile (et en fait techniquement impossible si le script d'installation d'un package ne respecte pas les conventions) d'interroger les alternatives fournies par un package désinstallé .

Gilles 'SO- arrête d'être méchant'
la source
0
  1. Normalement, * bin / sont les endroits les plus courants pour placer tous les programmes. Même en utilisant un lien. Il y a donc très peu de chances que vous ayez besoin de concerner des commandes en dehors de * bin /.
  2. Si vous n'avez pas installé apache2, dpkg -Lcela ne vous donnera sûrement pas de résultat. Veuillez essayer l'outil apt-file (vous devez l'installer).
  3. Le nom apache2 est un métapaquet, il ne contient aucun programme.
Magicloud
la source
-1

utilisez ci-dessous une commande et remplacez systemd par le nom de votre package ciblé. cette commande répertorie toutes les commandes disponibles avec leur intro à une ligne respectivement

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