Come posso trovare solo i file eseguibili sotto una determinata directory in Linux?
Il controllo dei file eseguibili può essere eseguito con -perm
(non consigliato) o -executable
(consigliato, poiché tiene conto di ACL). Per utilizzare l'opzione -executable
:
find <dir> -executable
se vuoi trovare solo i file eseguibili e non le directory ricercabili, combina con -type f
:
find <dir> -executable -type f
Utilizza l'opzione -perm
di find. Ciò troverà i file nella directory corrente che sono eseguibili dal loro proprietario, dai membri del gruppo o da altri:
find . -perm /u=x,g=x,o=x
Modificare:
Ho appena trovato un'altra opzione che è presente almeno in GNU find 4.4.0:
find . -executable
Questo dovrebbe funzionare anche meglio perché vengono considerati anche gli ACL.
So che la domanda menziona specificamente Linux, ma visto che è il primo risultato su Google, volevo solo aggiungere la risposta che stavo cercando (per esempio se sei - come me al momento - costretto dal tuo datore di lavoro a usare un non GNU/Sistema Linux).
Testato su macOS 10.12.5
find . -perm +111 -type f
Ho un altro approccio, nel caso in cui quello che vuoi veramente sia solo fare qualcosa con i file eseguibili - e non necessariamente forzare la ricerca per filtrare se stesso:
for i in `find -type f`; do [ -x $i ] && echo "$i is executable"; done
Lo preferisco perché non si basa su -executable
che è specifico per la piattaforma; e non si basa su -perm
che è un po 'arcano, un po' specifico per la piattaforma, e come scritto sopra richiede che il file sia eseguibile per tutti (non solo per te).
Il -type f
è importante perché in * nix le directory devono essere eseguibili per essere attraversabili, e più la query è nel comando find
, più efficiente sarà la memoria del tuo comando.
Comunque, sto offrendo un altro approccio, dato che * nix è la terra di un miliardo di approcci.
Un file contrassegnato come eseguibile non deve essere un file eseguibile o caricabile o un oggetto.
Ecco cosa uso:
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
Come un fan di una nave di linea ...
find /usr/bin -executable -type f -print0 | xargs file | grep ASCII
Usando 'xargs' per prendere l'output dal comando find (usando print0 per assicurarsi che i nomi di file con spazi siano gestiti correttamente). Ora abbiamo un elenco di file che sono eseguibili e li forniamo, uno per uno, come parametro per il comando 'file'. Quindi grep per il termine ASCII per ignorare i binari. Si prega di sostituire -executable nel comando find con quale stile si preferisce (vedere le risposte precedenti) o cosa funziona sul proprio sistema operativo NIX
Ho richiesto quanto sopra per trovare i file con eval negli script di proprietà di root, quindi ho creato quanto segue per aiutare a trovare i punti deboli dell'escalation dei privati in cui l'utente root esegue script con parametri non sicuri ...
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 &