Punta di cappello a @ gniourf_gniourf per aver chiarito un malinteso fondamentale.
Questa risposta cerca di fornire una panoramica delle risposte esistenti e di discutere le loro sottigliezze e relativi meriti , nonché di fornire informazioni di base , soprattutto per quanto riguarda la portabilità .
La ricerca di file eseguibili può fare riferimento a due casi d'uso distinti :
- incentrato sull'utente : trova i file eseguibili dall'utente corrente .
- incentrato sui file : trova i file che hanno (uno o più) bit di autorizzazione eseguibili impostati .
Nota che in entrambi gli scenari può avere senso usarefind -L ... invece che solo find ...per trovare anche collegamenti simbolici agli eseguibili .
Si noti che il caso più semplice incentrato sui file, ovvero la ricerca di eseguibili con il bit di autorizzazioni eseguibile impostato per TUTTE e tre le entità di sicurezza (utente, gruppo, altro), in genere , ma non necessariamente, produrrà gli stessi risultati dello scenario incentrato sull'utente, ed è importante per capire la differenza.
Incentrato sull'utente ( -executable)
La risposta accettata raccomanda lodevolmente -executable, IF GNU find è disponibile.
- GNU
findviene fornito con la maggior parte delle distribuzioni
Linux
- Al contrario, le piattaforme basate su BSD, incluso macOS, vengono fornite con BSD find, che è meno potente.
- Come richiesto dallo scenario,
-executablecorrisponde solo ai file che l' utente corrente può eseguire (ci sono casi limite. [1] ).
L' alternativa BSD find offerta dalla risposta accettata ( -perm +111) risponde a una domanda diversa , centrata sul file (come afferma la risposta stessa).
- Utilizzare solo
-permper rispondere alla domanda incentrata sull'utente è impossibile , perché ciò che è necessario è correlare l' utente del file e l'identità del gruppo all'utente corrente , mentre -permpuò solo testare i permessi del file .
Utilizzando solo le funzionalità POSIXfind , non è possibile rispondere alla domanda senza coinvolgere utilità esterne.
Quindi, il meglio che -permpuò fare (da solo) è un'approssimazione di -executable. Forse un'approssimazione più vicina di quanto non lo -perm +111sia-perm -111 , in modo da trovare file con il bit eseguibile impostato per TUTTE le entità di sicurezza (utente, gruppo, altro) - questo mi sembra il tipico scenario del mondo reale. Come bonus, sembra anche essere conforme a POSIX (da usare find -Lper includere collegamenti simbolici, vedere più avanti per una spiegazione):
find . -type f -perm -111 # or: find . -type f -perm -a=x
La risposta di gniourf_gniourf fornisce un vero equivalente portatile-executable dell'uso-exec test -x {} \;, anche se a scapito delle prestazioni .
La combinazione -exec test -x {} \; con -perm +111(cioè, file con almeno un bit eseguibile impostato) può aiutare le prestazioni in quanto execnon è necessario invocare per ogni file (il seguente utilizza l'equivalente conforme a POSIX di BSD find -perm +111/ GNU find -perm /111; vedi più avanti per una spiegazione) :
find . -type f \( -perm -u=x -o -perm -g=x -o -perm -o=x \) -exec test -x {} \; -print
Incentrato sui file ( -perm)
- Per rispondere a domande incentrate sui file , è sufficiente utilizzare il
-permprimario conforme a POSIX (noto come test in GNU find terminology).
-permti consente di testare qualsiasi autorizzazione sui file, non solo l'eseguibilità.
- Le autorizzazioni sono specificate come modalità ottale o simbolica . I modi ottali sono numeri ottali (ad esempio,
111), mentre i modi simbolici sono stringhe (ad esempio, a=x).
- Le modalità simboliche identificano le entità di sicurezza come
u(utente), g(gruppo) e o(altro) o aper fare riferimento a tutte e tre. Permessi vengono indicati come xper eseguibile, per esempio, e assegnati ai principal utilizzando gli operatori =, +e -; per una discussione completa, comprese le modalità ottali, vedere le specifiche POSIX per l' chmodutilità .
- Nel contesto di
find:
- Prefissare una modalità con
- (ad es. -ug=x) Significa: abbinare i file che hanno tutti i permessi specificati (ma i file corrispondenti potrebbero avere permessi aggiuntivi).
- Non avere alcun prefisso (ad esempio
755) significa: abbinare i file che hanno questo insieme completo ed esatto di autorizzazioni.
- Avvertenza : sia GNU find che BSD find implementano un prefisso aggiuntivo non standard con logica ANY-of-the-permission-bits-set specificata , ma lo fanno con una sintassi incompatibile :
- BSD trova:
+
- Ricerca GNU:
/ [2]
- Pertanto, evita queste estensioni, se il tuo codice deve essere portabile .
- Gli esempi seguenti dimostrano le risposte portatili a varie domande incentrate sui file.
Esempi di comandi incentrati sui file
Nota:
- I seguenti esempi sono conformi a POSIX , il che significa che dovrebbero funzionare in qualsiasi implementazione compatibile con POSIX, inclusi GNU find e BSD find; in particolare, ciò richiede:
- NON utilizzare prefissi in modalità non standard
+o /.
- Utilizzando le forme POSIX delle primarie dell'operatore logico :
!per NOT (GNU find e BSD find consentono anche -not); si noti che \!viene utilizzato negli esempi per proteggere !dalle espansioni della cronologia della shell
-aper AND (GNU find e BSD find consentono anche -and)
-oper OR (GNU find e BSD find consentono anche -or)
- Gli esempi utilizzano modalità simboliche , perché sono più facili da leggere e ricordare.
- Con il prefisso mode
-, gli operatori =e +possono essere usati in modo intercambiabile (ad esempio, -u=xè equivalente a -u+x- a meno che non si applichi in -xseguito, ma non ha senso farlo).
- Utilizzare
,per partecipare a modalità parziali; E la logica è implicita; ad esempio, -u=x,g=xsignifica che devono essere impostati sia l'utente che il bit eseguibile di gruppo.
- Le modalità non possono esprimere esse stesse una corrispondenza negativa nel senso di "corrispondenza solo se questo bit NON è impostato"; è necessario utilizzare un separato
-permespressione con la NON primaria, !.
- Si noti che i primari di find (come
-print, o -perm; noti anche come azioni e test in GNU find) sono implicitamente uniti con -a(AND logico) e che -oe possibilmente parentesi (con escape come \(e \)per la shell) sono necessarie per implementare la logica OR.
find -L ...invece di solo find ...è usato per abbinare anche i collegamenti simbolici agli eseguibili
-Lordina a find di valutare gli obiettivi dei collegamenti simbolici invece dei collegamenti simbolici stessi; quindi, senza -L, -type fignorerebbe del tutto i collegamenti simbolici.
# Match files that have ALL executable bits set - for ALL 3 security
# principals (u (user), g (group), o (others)) and are therefore executable
# by *anyone*.
# This is the typical case, and applies to executables in _system_ locations
# (e.g., /bin) and user-installed executables in _shared_ locations
# (e.g., /usr/local/bin), for instance.
find -L . -type f -perm -a=x # -a=x is the same as -ugo=x
# The POSIX-compliant equivalent of `-perm +111` from the accepted answer:
# Match files that have ANY executable bit set.
# Note the need to group the permission tests using parentheses.
find -L . -type f \( -perm -u=x -o -perm -g=x -o -perm -o=x \)
# A somewhat contrived example to demonstrate the use of a multi-principial
# mode (comma-separated clauses) and negation:
# Match files that have _both_ the user and group executable bit set, while
# also _not_ having the other executable bit set.
find -L . -type f -perm -u=x,g=x \! -perm -o=x
[1] Descrizione di -executableda a man findpartire da GNU find 4.4.2:
Corrisponde ai file che sono eseguibili e alle directory che sono ricercabili (in un senso di risoluzione del nome file). Questo tiene conto degli elenchi di controllo degli accessi e di altri artefatti dei permessi che il test -perm ignora. Questo test fa uso della chiamata di sistema access (2), e quindi può essere ingannato dai server NFS che eseguono la mappatura UID (o root-squash), poiché molti sistemi implementano l'accesso (2) nel kernel del client e quindi non possono farne uso le informazioni di mappatura UID contenute nel server. Poiché questo test si basa solo sul risultato della chiamata di sistema access (2), non vi è alcuna garanzia che un file per il quale questo test ha esito positivo possa essere effettivamente eseguito.
[2] GNU find versioni precedenti alla 4.5.12 consentivano anche il prefisso +, ma questo è stato prima deprecato e alla fine rimosso, perché la combinazione +con le modalità simboliche produce probabilmente risultati inaspettati poiché viene interpretata come una maschera di autorizzazioni esatte . Se voi (a) corsa su una versione prima 4.5.12 e (b) se stessi limitare a ottale modalità solo, si potrebbe farla franca con l'utilizzo +con entrambe GNU e BSD trovare ritrovamento, ma non è una buona idea.