Elenca tutti i comandi di uno specifico pacchetto Debian


9

Voglio sapere i comandi che mi offre uno specifico pacchetto Debian.

Ad esempio, supponiamo che abbia installato un pacchetto chiamato x.deb. Questo pacchetto contiene sicuramente alcuni comandi che posso usare.

Come elencare questi comandi.

So di poter usare il compgencomando bash per generare un elenco di tutti i comandi disponibili nel mio sistema, ma ciò di cui ho bisogno è solo per un pacchetto specifico.

Ho provato le soluzioni:

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

Ho provato il comando postgres

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

Risposte:


13

Usalo dpkg -L pkgnamee reindirizzalo a un comando grep cercando bin/e games/:

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

Se vuoi controllare tutti i file binari, indipendentemente dal fatto che siano nella tua $PATHprova, prova questa funzione bash:

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

Invoca così:

$ 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...

Potrebbe esserci un cestino al di fuori del cestino / o dei giochi /.
Maythux,

dpkg -L apache2 | egrep '(bin | games) /' Nessun risultato. Per favore, migliora la tua risposta
Maythux,

@Hadi apache2potrebbe essere un cattivo esempio perché quel pacchetto è un metapacchetto che di solito non è nemmeno installato su sistemi che eseguono Apache. Il comando funziona - prova coreutils:dpkg -L coreutils | egrep '(bin|games)/'
Martin von Wittich

1
+1, molto carino. Solo un paio di commenti, potresti voler usare grep -Ew 'bin|sbin|games'invece, egrep è deprecato e potresti anche cercare sbin. Inoltre, non c'è motivo di usare un forloop qui, usando un whileloop come ho fatto invece nella mia risposta, significa che non devi preoccuparti di IFS e di suddivisione delle parole.
terdon

1
Da 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.Inoltre, regex, corrisponderà a qualsiasi directory che contiene uno gameso binche includerà /usr/share/games/, e anche foosbinaffe qualsiasi altra cosa.
terdon

11

1. Utilizzare uno strumento progettato per il lavoro.

Il modo più semplice e probabilmente il più robusto è installare dlocate:

sudo apt-get install dlocate

È quindi possibile eseguire

dlocate -lsbin package-name

Come spiegato in man dlocate:

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

2. Analizzare il database del pacchetto

Questo è un approccio simile a quello di @ Winny ma semplificato

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

Se non hai apt-fileinstallato, puoi installarlo e configurarlo con questi comandi:

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

Il comando sopra usa apt-fileper elencare il contenuto di un pacchetto e quindi i test di bash -f(è un file?) E -x(è eseguibile?) E stampa il nome del file se entrambi i test vengono superati.

Nota che mentre qualcosa come il comando seguente ti porterà la maggior parte degli eseguibili:

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

non troverà tutto perché ottieni anche eseguibili in luoghi simili /opto addirittura /lib(vari udevstrumenti per esempio). Quindi, mentre si usa il -wper abbinare parole intere aumenta le possibilità di identificare correttamente i file, analizzare il percorso non è un buon approccio e si dovrebbe usare invece uno dei metodi sopra.


Gli eseguibili in /opto /libnon sono pensati per essere invocati dagli utenti, quindi non dovresti elencarli. `apt-file -F list $ pacchetto | grep -E '^ (/ usr) / (s? bin | games) /' ti dà la lista, con una sola eccezione: alternative .
Gilles 'SO- smetti di essere malvagio'

@Gilles Non vedo perché no, l'OP ha chiesto i comandi, se questi dovevano essere eseguiti manualmente o no, oltre al punto. Inoltre, ci sono dei buoni motivi per usarne alcuni, ad esempio /lib/udev/findkeyboardspuò essere molto utile quando si scrivono regole udev da tastiera .
terdon

/lib/udev/rule_generator.functionspuò anche essere utile. Se inizi a elencare tutto ciò che è utile, allora non sono solo gli eseguibili che devi elencare, ma qualsiasi tipo di libreria di codici.
Gilles 'SO- smetti di essere malvagio' il

2

Se hai dlocateinstallato, c'è un modo semplice per elencare tutti i comandi in un pacchetto installato:

dlocate -lsbin PACKAGE-NAME

Con just dpkg, puoi elencare i file nelle directory PATH standard (sono quasi tutti programmi eseguibili, con pochissime eccezioni):

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

Le eccezioni sono un paio di directory - a partire da Debian wheezy, solo due: /usr/bin/mhe /usr/bin/nu-mh.

Se il pacchetto non è installato, sostituirlo dpkg -Lcon apt-file -F list:

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

Mentre ci sono file eseguibili in altre directory, non sono pensati per essere eseguiti direttamente, il che li rende irrilevanti qui.

Tutti questi metodi mancano di una serie di programmi: quelli forniti attraverso il meccanismo delle alternative . Ad esempio, solo per il ftppacchetto netkit-ftpe pftpvengono forniti, ma questo pacchetto fornisce effettivamente il ftpcomando, poiché /usr/bin/ftpè potenzialmente un collegamento simbolico al /etc/alternatives/ftpquale è un collegamento simbolico a una delle ftpimplementazioni sul sistema /usr/bin/netkit-ftp. Il seguente comando (che non è un esempio di buona programmazione, solo un grande one-liner) elenca i comandi forniti da un pacchetto tramite il meccanismo delle alternative, come attualmente configurato.

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 si desidera elencare i comandi che potrebbero essere forniti tramite un'alternativa attualmente configurata per puntare a un pacchetto diverso, è necessario analizzare i file /var/lib/dpkg/alternatives.

I collegamenti simbolici e i file di configurazione che implementano i meccanismi alternativi non sono registrati nei pacchetti ma registrati automaticamente postinst, il che rende difficile (e di fatto tecnicamente impossibile se lo script di installazione di un pacchetto non segue le convenzioni) per interrogare le alternative fornite da un pacchetto disinstallato .


0
  1. Normalmente, * bin / sono i luoghi più comuni in cui posizionare tutti i programmi. Anche usando un link. Quindi ci sono poche possibilità che tu debba occuparti dei comandi al di fuori di * bin /.
  2. Se non hai installato apache2, dpkg -Lsicuramente non ti darà risultati. Prova lo strumento apt-file (devi installarlo).
  3. Il nome apache2 è un metapacchetto, non contiene alcun programma.

-1

utilizzare sotto un comando e sostituire systemd con il nome del pacchetto di destinazione. questo comando elencherà tutti i comandi disponibili con la loro introduzione di una riga rispettivamente

dpkg -L systemd | grep 'sbin\|bin' | awk -F "/" '{print $NF}' | xargs man | grep ' - ' 2> /dev/null
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.