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

158598
HaiYuan Zhang

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

129
Hier ist eine Art BASH-Skript, es ist nicht schlecht, was ich dazu sagen kann: http://stackoverflow.com/a/20209457/2067125 AjayKumarBasuthkar vor 10 Jahren 0
Was ist mit dem Standardbefehl [`file`] (http://en.wikipedia.org/wiki/File_%28command%29)? Breakthrough vor 9 Jahren 0
Für alle, die dies auf einem ** Mac ** (getestet unter OS X 10.9.5) tun möchten: `ls -l | egrep '^ [^ d] .. x..x..x. * $' `Im obigen Verzeichnis werden alle ausführbaren Dateien (für alle Benutzer und Gruppen) im aktuellen Verzeichnis aufgeführt. * Hinweis *: Die Option "-executable" funktioniert auf einem Mac nicht und ist daher die oben genannte Problemumgehung. techfoobar vor 9 Jahren 4
Ebenfalls relevant: [Unix-Suche: Suche nach ausführbaren Dateien] (http://stackoverflow.com/questions/4458120/unix-find-search-for-executable-files) Slothworks vor 8 Jahren 0
@techfoobar: Die Frage ist mehrdeutig: Bedeutet dies Dateien, die ausführbaren Code enthalten, oder sind es Dateien mit ausführbaren Berechtigungen? Aber selbst wenn wir davon ausgehen, dass die ausführbare Berechtigung das ist, was gewünscht wird (wie die Mehrheit der Antworten zu sein scheinen), sagt die Frage nicht, dass die Welt ausführbar ist. Ihre Lösung findet Dateien (und auch Fifos, Sockets, Symlinks usw.), die über die Berechtigung zum Ausführen von Worlds verfügen, nicht jedoch 750 (`-rwxr-x ---`), die für einige Benutzer noch ausführbar ist. G-Man vor 8 Jahren 1

6 Antworten auf die Frage

134
knittl

Die Prüfung auf ausführbare Dateien kann mit -perm(nicht empfohlen) oder -executable(empfohlen, da ACL berücksichtigt wird) durchgeführt werden. So verwenden Sie die -executableOption:

find <dir> -executable 

Wenn Sie nur ausführbare Dateien und nicht durchsuchbare Verzeichnisse suchen möchten, kombinieren Sie diese mit -type f:

find <dir> -executable -type f 
Dadurch werden Dateien nur bei aktivierter Ausführung zurückgegeben. Bei einer gründlicheren Analyse wird geprüft, ob eine Shebang-Zeile vorliegt oder ob die Datei binär ist vor 14 Jahren 0
Ein Shebang bedeutet nicht, dass sie ausführbar sind. es sagt uns nur, welchen Interpreter es verwenden soll. Unter Linux-Definition sind „ausführbare Dateien“ Dateien, bei denen das ausführbare (x) Bit gesetzt ist knittl vor 14 Jahren 21
Welche Version von find unterstützt diesen Typ für -type? Man findet die Listen b, c, d, p, f, l, s und D auf meinem System. innaM vor 14 Jahren 2
Gleich hier, mein Fund hat auch keinen Typ x. davr vor 14 Jahren 2
Aus irgendeinem Grund denke ich immer, dass "-Typ x" auch funktionieren wird. Ich kann mir nur vorstellen, dass es für einige Unix-Varianten, die ich einmal verwendete, verfügbar war. Dave Webb vor 14 Jahren 0
@dave: froh zu hören, dass ich nicht der einzige bin :) knittl vor 14 Jahren 0
Wenn Sie eine alte Version von find (wahrscheinlich vor 4.3.8) haben, die nicht -executable enthält, verwenden Sie find. -perm / u = x, g = x, o = x. Ludwig Weinzierl vor 13 Jahren 6
-executable ist überhaupt nicht portabel und sollte vermieden werden Good Person vor 11 Jahren 2
`find: invalid predicate -executable '' auf RHEL SSH This vor 10 Jahren 6
29
innaM

Verwenden Sie die -permSuchoption. Dadurch werden Dateien im aktuellen Verzeichnis gefunden, die entweder vom Eigentümer, von Gruppenmitgliedern oder von anderen Personen 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.

Dies funktioniert nur bei einer neueren Version von find. Der Standardwert, der standardmäßig mit CentOS geliefert wird, gibt den Fehler `find: invalid mode` / u = x, g = x, o = x '' aus davr vor 14 Jahren 1
Dann sollten Sie die "-perm +" -Version ausprobieren, die jetzt in GNU find: find veraltet ist. -perm +111 " innaM vor 14 Jahren 9
Scheint, als könnte -perm / 111 die tragbarste Version sein. Scott vor 8 Jahren 0
8
friederbluemle

Ich weiß, dass die Frage speziell Linux erwähnt, aber da dies das erste Ergebnis bei Google ist, wollte ich nur die Antwort hinzufügen, die ich gesucht hatte (zum Beispiel, wenn Sie - wie ich gerade - von Ihrem Arbeitgeber gezwungen werden, eine Nicht-GNU zu verwenden / Linux-System).

Getestet mit macOS 10.12.5

find . -perm +111 -type f 
Funktioniert auch in RHEL 5. José Tomás Tocino vor 5 Jahren 1
3
Mark McKenna

I have another approach, in case what you really want is just to do something with executable files--and not necessarily to actually force find to filter itself:

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

I prefer this because it doesn't rely on -executable which is platform specific; and it doesn't rely on -perm which is a bit arcane, a bit platform specific, and as written above requires the file to be executable for everyone (not just you).

The -type f is important because in *nix directories have to be executable to be traversable, and the more of the query is in the find command, the more memory efficient your command will be.

Anyhow, just offering another approach, since *nix is the land of a billion approaches.

(0) Welche bevorzugen Sie, arkan und korrekt oder intuitiv und fehlerhaft? Ich bevorzuge es richtig. (1) [innaMs Antwort] (http://superuser.com/a/39100/150988) mit `find -perm` sucht nach Dateien, für die ein beliebiges Ausführungsberechtigungsbit gesetzt ist. (2) Im Gegensatz dazu findet diese Antwort nur Dateien, für die der aktuelle Benutzer die Ausführungsberechtigung hat. Zugegeben, das ist vielleicht das, was das OP will, aber es ist unklar. … (Fortsetzung) Scott vor 8 Jahren 0
(Fortsetzung)… (3) Der Klarheit halber sollten Sie `\`… \ `` in `$ (…)` ändern - siehe [this] (http://unix.stackexchange.com/q/5778) / 23408), [this] (http://unix.stackexchange.com/q/147838/23408) und [this] (http://unix.stackexchange.com/q/104119/23408). (4) Aber mache nicht 'für i in $ (find ...); do ... `; Es schlägt fehl bei Dateinamen, die Leerzeichen enthalten. Suchen Sie stattdessen… -exec…. (5) Wenn Sie mit Shell-Variablen arbeiten, zitieren Sie sie immer (in doppelten Anführungszeichen), es sei denn, Sie haben einen guten Grund, dies nicht zu tun, und wissen, was Sie tun. Scott vor 8 Jahren 0
@scott OK, ich stehe korrigiert :) Ich lese das `-perm`-Argument, da es alle drei erfordert, nicht eines davon. Danke auch für den Beitrag zum Schutz von Shell-Argumenten. Das ist alles, was ich nicht wusste. Mark McKenna vor 8 Jahren 0
@MarkMcKenna Sie haben einen Tippfehler: `for i in` find. -type f "; do [-x $ i] && echo "$ i ist ausführbar"; erledigt "; Sie vermissen das Teil, den ich einen Punkt benutze (.) Devy vor 7 Jahren 0
2
AjayKumarBasuthkar

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

Ich verwende Folgendes:

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 
Was macht das? DerMike vor 9 Jahren 2
@DerMike, Dies ist eine der Möglichkeiten, nach ausführbaren Dateien im aktuellen Verzeichnis zu suchen, einschließlich .so-Dateien. Auch wenn eine Datei nicht als ausführbar markiert ist, kann sie dies feststellen. AjayKumarBasuthkar vor 9 Jahren 0
Nun, ich meine, wie macht es das? DerMike vor 9 Jahren 0
Es liest aus dem Header der zu entdeckenden Datei, jede Binärdatei oder Skriptdatei hat einen Header. AjayKumarBasuthkar vor 9 Jahren 0
Soweit ich weiß, hat `-name" * "` keine Auswirkung auf `find` - normalerweise werden alle Dateien gefunden, die nicht durch Tests entfernt wurden. G-Man vor 8 Jahren 0
@AjayKumarBasuthkar Sie wissen, dass dies keine Antwort auf die Frage ist? Die Frage war, wie man ausführbare Dateien (= diejenigen, die ausgeführt werden können, = die w / + x) suchen. nicht wie man alle ELF-, EXE- und was auch immer-ocamlrun-Dateien findet. nonchip vor 7 Jahren 0
1
Richard Braganza

Als Fan des einen Liners ...

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

Verwenden Sie 'xargs', um die Ausgabe des Suchbefehls zu übernehmen (verwenden Sie print0, um sicherzustellen, dass Dateinamen mit Leerzeichen korrekt verarbeitet werden). Wir haben jetzt eine Liste von Dateien, die ausführbar sind, und wir geben sie einzeln als Parameter für den Befehl 'file' an. Dann grep für den Begriff ASCII, um Binärdateien zu ignorieren. Ersetzen Sie -executable im find-Befehl durch den von Ihnen bevorzugten Stil (siehe vorherige Antworten) oder was auf Ihrem 'NIX-Betriebssystem funktioniert

Ich habe das Obige benötigt, um Dateien mit eval in Skripts zu finden, deren Eigentümer root ist. Daher wurde Folgendes erstellt, um Schwachstellen in Bezug auf die Eskalation von Privilegien zu finden, bei denen der Root-Benutzer Skripts 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 & 
Das funktioniert nicht, wenn das Skript Nicht-ASCII-Zeichen enthält. `file` meldet die Kodierung, daher kann ein Python-Skript als` a usr / bin / python-Skript, UTF-8 Unicode Text Executable 'gemeldet werden. `finde ... | xargs-Datei -b | grep -v '^ ELF'` könnte besser funktionieren, um die Nicht-Binärdateien zu erkennen. xenoid vor 6 Jahren 0