it-swarm.com.de

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

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

145
HaiYuan Zhang

Das Überprüfen auf ausführbare Dateien kann mit -perm (nicht empfohlen) oder -executable (empfohlen, da ACL berücksichtigt wird) erfolgen. So verwenden Sie die Option -executable:

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
148
knittl

Verwenden Sie die Option -perm der Suche. Dies findet Dateien im aktuellen Verzeichnis, die entweder von ihrem Besitzer, von Gruppenmitgliedern oder von anderen ausgeführt werden können:

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

Bearbeiten:

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

find . -executable

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

31
innaM

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

Getestet unter macOS 10.12.5

find . -perm +111 -type f
12
friederbluemle

Ich habe einen anderen Ansatz, für den Fall, dass Sie wirklich nur etwas mit ausführbaren Dateien tun möchten - und nicht unbedingt herausfinden müssen, um sich selbst zu filtern:

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

Ich bevorzuge dies, weil es nicht auf -executable beruht, der plattformspezifisch ist. und es hängt nicht von -perm ab, der ein bisschen geheimnisvoll, ein bisschen plattformspezifisch ist und wie oben beschrieben erfordert, dass die Datei für alle (nicht nur für Sie) ausführbar ist.

Der -type f ist wichtig, da in * nix Verzeichnisse ausführbar sein müssen, damit sie durchlaufen werden können, und je mehr Abfrage sich im Befehl find befindet, desto speichereffizienter ist Ihr Befehl.

Jedenfalls, nur einen anderen Ansatz anzubieten, da * nix das Land der Milliardenansätze ist.

3
Mark McKenna

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

Folgendes verwende ich:

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
2

Als Fan des One Liner ...

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

Verwenden Sie 'xargs', um die Ausgabe des Befehls find zu übernehmen (verwenden Sie print0, um sicherzustellen, dass Dateinamen mit Leerzeichen korrekt behandelt werden). Wir haben jetzt eine Liste der ausführbaren Dateien und stellen sie einzeln als Parameter für den Befehl 'file' zur Verfügung. Suchen Sie dann nach dem Begriff ASCII, um die Binärdateien zu ignorieren. Ersetzen Sie den Befehl -executable in find durch den von Ihnen bevorzugten Stil (siehe frühere Antworten) oder den auf Ihrem NIX-Betriebssystem verwendeten

Ich benötigte das Obige, um Dateien mit eval in Skripten zu finden, die root gehören. Daher haben wir das Folgende erstellt, um Schwachstellen bei der privaten Eskalation zu finden, bei denen Root-Benutzer Skripten mit unsicheren Parametern ausführen ...

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 &
1