Wie finde ich unter Linux nur die ausführbaren Dateien in einem bestimmten Verzeichnis?
linux
command-line
bash
find
HaiYuan Zhang
quelle
quelle
file
Befehl ?ls -l | egrep '^[^d]..x..x..x.*$'
Die oben stehende Liste listet alle ausführbaren Dateien (für alle / Benutzer und Gruppen) im aktuellen Verzeichnis auf. Hinweis : Die-executable
Option funktioniert nicht auf einem Mac, daher die oben beschriebene Problemumgehung.-rwxr-x---
), die für einige Benutzer noch ausführbar ist.Antworten:
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-executable
Option:Wenn Sie nur ausführbare Dateien und keine durchsuchbaren Verzeichnisse finden möchten, kombinieren Sie mit
-type f
:quelle
-type x
.find: invalid predicate -executable'
auf RHELVerwenden Sie die
-perm
Suchoption. Dies findet Dateien im aktuellen Verzeichnis, die entweder von ihrem Besitzer, von Gruppenmitgliedern oder von anderen ausgeführt werden können:Bearbeiten:
Ich habe gerade eine andere Option gefunden, die zumindest in GNU find 4.4.0 vorhanden ist:
Dies sollte noch besser funktionieren, da auch ACLs berücksichtigt werden.
quelle
find: invalid mode
Diejenige, die standardmäßig mit CentOS geliefert wird, gibt den Fehler / u = x, g = x, o = x'`-perm /111
dies die portabelste Version.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 werden, ein Nicht-GNU-System zu verwenden / Linux-System).
Getestet unter macOS 10.12.5
quelle
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:
Ich bevorzuge dies, weil es nicht darauf ankommt,
-executable
welche Plattform spezifisch ist. und es hängt nicht davon ab,-perm
welches ein bisschen geheimnisvoll, ein bisschen plattformspezifisch ist, und wie oben beschrieben, muss die Datei für alle (nicht nur für Sie) ausführbar sein.Dies
-type f
ist wichtig, da in * nix Verzeichnisse ausführbar sein müssen, damit sie durchlaufen werden können. Je mehr sich die Abfrage imfind
Befehl befindet, desto speichereffizienter ist Ihr Befehl.Jedenfalls nur einen anderen Ansatz anzubieten, da * nix das Land der Milliarden Ansätze ist.
quelle
find -perm
findet Dateien, für die ein Ausführungsberechtigungsbit gesetzt ist. (2) Im Gegensatz dazu findet diese Antwort nur Dateien, für die der aktuelle Benutzer Ausführungsberechtigungen hat. Zugegeben, das ist vielleicht das, was die OP will, aber es ist unklar. … (Fortsetzung)`…`
um$(…)
- dies , dies und das zu sehen . (4) Aber tu es nichtfor i in $(find …); do …
; Es schlägt bei Dateinamen fehl, die Leerzeichen enthalten. Stattdessen tunfind … -exec …
. (5) Und 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 Sie sind sicher, dass Sie wissen, was Sie tun.-perm
Argument so gelesen, dass es alle drei erfordert, nicht einen von ihnen. Vielen Dank für den Input zum Schutz von Shell-Argumenten, all das war mir nicht bewusst.for i in
find. -Typ f; do [ -x $i ] && echo "$i is executable"; done
; Ihnen fehlt der Teil <dir>, für den ich einen Punkt (.) verwendeEine als ausführbar markierte Datei muss keine ausführbare Datei oder ladbare Datei oder ein Objekt sein.
Folgendes verwende ich:
quelle
-name "*"
hat das keine Auswirkungfind
- es werden normalerweise alle Dateien gefunden, die nicht durch Tests beseitigt werden.Als Fan des One Liner ...
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 ...
quelle
file
meldet die Codierung, sodass ein Python-Skript als gemeldet werden kanna /usr/bin/python script, UTF-8 Unicode text executable
.find ... | xargs file -b | grep -v '^ELF'
könnte besser funktionieren, um die Nicht-Binärdateien zu erkennen.Ich habe
~/.bashrc
heute Abend eine Funktion erstellt , um ausführbare Dateien zu finden, die nicht im Systempfad und nicht in Verzeichnissen enthalten sind:Der Vorteil ist, dass in weniger als einer Sekunde drei Linux-Distributionen und eine Windows-Installation durchsucht werden, wobei der
find
Befehl 15 Minuten dauert.Zum Beispiel:
Oder für ein ganzes Verzeichnis und alle Subs:
quelle