2009-09-10 11:56:56 +0000 2009-09-10 11:56:56 +0000
170
170

Wie kann ich in Linux nur die ausführbaren Dateien unter einem bestimmten Verzeichnis finden?

Wie kann ich in Linux nur die ausführbaren Dateien unter einem bestimmten Verzeichnis finden?

Antworten (7)

170
170
170
2009-09-10 11:59:26 +0000

Die Prüfung auf ausführbare Dateien kann mit -perm (nicht empfohlen) oder -executable (empfohlen, da es ACL berücksichtigt) durchgeführt werden. Um die Option -executable zu verwenden:

find <dir> -executable

, wenn Sie nur ausführbare Dateien und keine durchsuchbaren Verzeichnisse finden möchten, kombinieren Sie mit -type f:

find <dir> -executable -type f
35
35
35
2009-09-10 15:55:13 +0000

Verwenden Sie die Option -perm des Suchergebnisses. Dadurch werden Dateien im aktuellen Verzeichnis gefunden, die entweder von ihrem Besitzer, von Gruppenmitgliedern oder von anderen ausführbar sind:

find . -perm /u=x,g=x,o=x

Bearbeiten:

Ich habe gerade eine weitere Option gefunden, die zumindest in GNU find 4.4.0 vorhanden ist:

find . -executable

Dies sollte sogar noch besser funktionieren, da auch ACLs berücksichtigt werden.

16
16
16
2017-06-01 06:59:33 +0000

Ich weiß, dass in der Frage ausdrücklich Linux erwähnt wird, aber da es das erste Ergebnis bei Google ist, wollte ich nur die Antwort hinzufügen, nach der ich gesucht habe (z.B. wenn Sie - wie ich im Moment - von Ihrem Arbeitgeber gezwungen werden, ein Nicht-GNU/Linux-System zu verwenden).

Getestet auf macOS 10.12.5

find . -perm +111 -type f
3
3
3
2016-04-24 02:38:26 +0000

Ich habe einen anderen Ansatz, für den Fall, dass das, was Sie wirklich wollen, nur etwas mit ausführbaren Dateien zu tun hat - und nicht notwendigerweise die Suche erzwingen will, um sich selbst zu filtern:

for i in `find -type f`; do [-x $i] && echo "$i is executable"; done

Ich bevorzuge diesen Ansatz, weil er sich nicht auf -executable verlässt, was plattformspezifisch ist; und er verlässt sich nicht auf -perm, was ein bisschen geheimnisvoll ist, ein bisschen plattformspezifisch, und wie oben geschrieben, verlangt, dass die Datei für jeden (nicht nur für Sie) ausführbar ist.

Die -type f ist wichtig, weil in *nix Verzeichnisse ausführbar sein müssen, um durchsuchbar zu sein, und je mehr von der Abfrage im Befehl find enthalten ist, desto speichereffizienter wird Ihr Befehl sein.

Wie auch immer, ich biete nur einen anderen Ansatz an, da *nix das Land der Milliarden Ansätze ist.

2
2
2
2014-03-26 07:52:24 +0000

Eine als ausführbar markierte Datei muss keine ausführbare oder ladbare Datei oder Objekt sein.

Hier ist, was ich verwende:

find ./ -type f -name "*" -not -name "*.o" -exec sh -c '
    case "$(head -n 1 "$1")" in
      ?ELF*) exit 0;;
      MZ*) exit 0;;
      #!*/ocamlrun*)exit0;;
    esac
exit 1
' sh {} \; -print
1
1
1
2017-07-09 12:31:14 +0000

Als Fan des einen Liners…

find /usr/bin -executable -type f -print0 | xargs file | grep ASCII

Verwendung von ‘xargs’, um die Ausgabe des Befehls find zu übernehmen (mit print0, um sicherzustellen, dass Dateinamen mit Leerzeichen korrekt behandelt werden). Wir haben nun eine Liste der ausführbaren Dateien und stellen sie, eine nach der anderen, als Parameter für den Befehl ‘file’ zur Verfügung. Greifen Sie dann nach dem Begriff ASCII, um Binärdateien zu ignorieren. Bitte ersetzen Sie den Befehl -ausführbar im Befehl find durch den von Ihnen bevorzugten Stil (siehe frühere Antworten) oder durch das, was auf Ihrem ‘NIX OS

funktioniert. Ich habe das oben Gesagte benötigt, um Dateien mit eval in Skripten zu finden, die Root gehören, also habe ich das Folgende erstellt, um Schwachstellen bei der Private-Eskalation zu finden, wenn der Benutzer root Skripte mit unsicheren Parametern ausführt…

echo -n "+ Identifying script files owned by root that execute and have an eval in them..."
find / -not \( -path /proc -prune \) -type f -executable -user root -exec grep -l eval {} \; -exec file {} \; | grep ASCII| cut -d ':' -f1 > $outputDir"/root_owned_scripts_with_eval.out" 2>/dev/null &
0
0
0
2019-06-06 00:08:27 +0000

Ich habe heute Abend in ~/.bashrc eine Funktion erstellt, um ausführbare Dateien zu finden, die nicht im Systempfad und nicht in Verzeichnissen liegen:

# Quickly locate executables not in the path
xlocate () {
    locate -0r "$1" | xargs -0 -I{} bash -c '[[-x "$1"]] && [[! -d "$1"]] \
        && echo "executable: $1"' _ {}
} # xlocate ()

Der Vorteil ist, dass sie drei Linux-Distributionen und eine Windows-Installation in unter einer Sekunde sucht, wobei der Befehl find 15 Minuten dauert.

Zum Beispiel:

$ time xlocate llocate
executable: /bin/ntfsfallocate
executable: /home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/bin/ntfsfallocate
executable: /mnt/clone/home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/usr/bin/fallocate
executable: /mnt/e/bin/llocate
executable: /mnt/old/bin/ntfsfallocate
executable: /mnt/old/usr/bin/fallocate
executable: /usr/bin/fallocate

real 0m0.504s
user 0m0.487s
sys 0m0.018s

Oder für ein ganzes Verzeichnis und alle seine Unterverzeichnisse:

$ time xlocate /mnt/e/usr/local/bin/ | wc -l
65

real 0m0.741s
user 0m0.705s
sys 0m0.032s