it-swarm-eu.dev

Come posso trovare solo i file eseguibili sotto una determinata directory in Linux?

Come posso trovare solo i file eseguibili sotto una determinata directory in Linux?

145
HaiYuan Zhang

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

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.

31
innaM

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
12
friederbluemle

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.

3
Mark McKenna

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
2

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