Listen Sie alle Befehle eines bestimmten Debian-Pakets auf

9

Ich möchte wissen, welche Befehle mir ein bestimmtes Debian-Paket bietet.

Nehmen wir zum Beispiel an, ich habe ein Paket namens installiert x.deb. Dieses Paket enthält sicherlich einige Befehle, die ich verwenden kann.

So listen Sie diese Befehle auf.

Ich weiß, dass ich den compgenBefehl bash verwenden kann, um eine Liste aller verfügbaren Befehle in meinem System zu generieren, aber ich brauche nur ein bestimmtes Paket.

Ich habe die Lösungen ausprobiert:

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

Ich habe den Befehl ausprobiert postgres

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

Antworten:

13

Verwenden Sie es dpkg -L pkgnameund leiten Sie es an einen grep-Befehl weiter, der nach bin/und sucht games/:

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

Wenn Sie nach allen Binärdateien $PATHsuchen möchten, unabhängig davon, ob sie sich in Ihrer Datei befinden, versuchen Sie diese Bash-Funktion:

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

Rufen Sie so auf:

$ 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
quelle
Es könnte einen Behälter außerhalb des Behälters / oder Spiele / geben.
Maythux
dpkg -L apache2 | egrep '(bin | games) /' Kein Ergebnis. Bitte verbessern Sie Ihre Antwort
Maythux
@Hadi apache2kann ein schlechtes Beispiel sein, da dieses Paket ein Metapaket ist, das normalerweise nicht einmal auf Systemen installiert ist, auf denen Apache ausgeführt wird. Der Befehl funktioniert - versuchen Sie coreutils:dpkg -L coreutils | egrep '(bin|games)/'
Martin von Wittich
1
+1, sehr schön. Nur ein paar Kommentare, die Sie vielleicht grep -Ew 'bin|sbin|games'stattdessen verwenden möchten , egrep ist veraltet und Sie können auch nach sbin suchen. Es gibt auch keinen Grund, forhier eine whileSchleife zu verwenden. Wenn Sie stattdessen eine Schleife verwenden, wie ich es in meiner Antwort getan habe, müssen Sie sich keine Gedanken über IFS und Wortaufteilung machen.
Terdon
1
Von 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.Außerdem stimmt Ihr regulärer Ausdruck mit jedem Verzeichnis überein , das entweder enthält gamesoder binenthält /usr/share/games/, und auch foosbinaffund was auch immer.
Terdon
11

1. Verwenden Sie ein für den Job entwickeltes Werkzeug.

Der einfachste und wahrscheinlich robusteste Weg ist die Installation dlocate:

sudo apt-get install dlocate

Sie können dann laufen

dlocate -lsbin package-name

Wie erklärt in man dlocate:

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

2. Analysieren Sie die Paketdatenbank

Dies ist ein ähnlicher Ansatz wie bei @ Winny, jedoch vereinfacht

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

Wenn Sie nicht apt-fileinstalliert haben, können Sie es mit den folgenden Befehlen installieren und einrichten:

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

Der obige Befehl wird verwendet, apt-fileum den Inhalt eines Pakets aufzulisten und dann die Tests von bash -f(ist dies eine Datei?) Und -x(ist sie ausführbar?) Aufzulisten und den Namen der Datei zu drucken, wenn beide Tests bestanden wurden.

Beachten Sie, dass Sie mit dem folgenden Befehl die meisten ausführbaren Dateien erhalten:

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

Es wird nicht alles gefunden, da Sie auch ausführbare Dateien an Orten wie /optoder sogar erhalten /lib( udevz. B. verschiedene Tools). Während die Verwendung von -w, um ganze Wörter abzugleichen, Ihre Chancen erhöht, die Dateien korrekt zu identifizieren, ist das Parsen des Pfads kein guter Ansatz, und Sie sollten stattdessen eine der oben genannten Methoden verwenden.

terdon
quelle
Ausführbare Dateien in /optoder /libsollen nicht von Benutzern aufgerufen werden, daher sollten Sie sie nicht auflisten. `apt-file -F list $ package | grep -E '^ (/ usr) / (s? bin | games) /' gibt Ihnen die Liste mit einer Ausnahme: Alternativen .
Gilles 'SO - hör auf böse zu sein'
@ Gilles Ich verstehe nicht warum nicht, das OP fragte nach Befehlen, ob diese manuell ausgeführt werden sollten oder nicht, ist nebensächlich. Es gibt auch gute Gründe, einige davon zu verwenden. Dies /lib/udev/findkeyboardskann beispielsweise beim Schreiben von udev-Tastaturregeln sehr nützlich sein .
Terdon
/lib/udev/rule_generator.functionskann auch nützlich sein. Wenn Sie anfangen, alles Nützliche aufzulisten, müssen Sie nicht nur ausführbare Dateien auflisten, sondern jede Art von Codebibliothek.
Gilles 'SO - hör auf böse zu sein'
2

Wenn Sie dlocateinstalliert haben, gibt es eine einfache Möglichkeit , alle Befehle in einem installierten Paket aufzulisten:

dlocate -lsbin PACKAGE-NAME

Nur mit dpkg können Sie die Dateien in den Standard-PATH-Verzeichnissen auflisten (es sind fast alle ausführbaren Programme, mit sehr wenigen Ausnahmen):

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

Die Ausnahmen sind ein paar Verzeichnisse - ab Debian Wheezy nur zwei: /usr/bin/mhund /usr/bin/nu-mh.

Wenn das Paket nicht installiert ist, ersetzen Sie es dpkg -Ldurchapt-file -F list :

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

Es gibt zwar ausführbare Dateien in anderen Verzeichnissen, diese sollen jedoch nicht direkt ausgeführt werden, weshalb sie hier irrelevant sind.

Diese Methoden vermissen alle eine Reihe von Programmen: diejenigen, die über den alternativen Mechanismus bereitgestellt werden . Zum Beispiel nur für das ftpPaket netkit-ftpund pftpwerden bereitgestellt, aber dieses Paket stellt tatsächlich den ftpBefehl bereit , da /usr/bin/ftpes sich um eine symbolische Verknüpfung handelt, zu /etc/alternatives/ftpder ftpmöglicherweise eine symbolische Verknüpfung zu einer der Implementierungen auf dem System besteht /usr/bin/netkit-ftp. Der folgende Befehl (der kein Beispiel für eine gute Programmierung ist, sondern nur ein großer Einzeiler) listet die Befehle auf, die von einem Paket über den derzeit konfigurierten Alternativmechanismus bereitgestellt werden.

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…

Wenn Sie die Befehle auflisten möchten, die über eine Alternative bereitgestellt werden könnten, die derzeit so konfiguriert ist, dass sie auf ein anderes Paket verweist, müssen Sie die Dateien analysieren /var/lib/dpkg/alternatives .

Symbolische Links und Konfigurationsdateien, die die alternativen Mechanismen implementieren, werden nicht in Paketen registriert, sondern automatisch in Paketen registriert. Dies postinstmacht es schwierig (und technisch unmöglich, wenn das Installationsskript eines Pakets nicht den Konventionen entspricht), die von einem deinstallierten Paket bereitgestellten Alternativen abzufragen .

Gilles 'SO - hör auf böse zu sein'
quelle
0
  1. Normalerweise sind * bin / die häufigsten Orte, an denen alle Programme platziert werden. Auch über einen Link. Es besteht also nur eine sehr geringe Wahrscheinlichkeit, dass Sie Befehle außerhalb von * bin / betreffen müssen.
  2. Wenn Sie Apache2 nicht installiert haben, erhalten Sie mit dpkg -LSicherheit kein Ergebnis. Bitte versuchen Sie es mit dem apt-file Tool (Sie müssen es installieren).
  3. Der Name apache2 ist ein Metapaket, es enthält keine Programme.
Magicloud
quelle
-1

Verwenden Sie den folgenden Befehl und ersetzen Sie systemd durch Ihren Zielpaketnamen. Dieser Befehl listet alle verfügbaren Befehle mit ihrem jeweils einzeiligen Intro auf

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