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
find
viene 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,
-executable
corrisponde 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
-perm
per 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 -perm
può solo testare i permessi del file .
Utilizzando solo le funzionalità POSIXfind
, non è possibile rispondere alla domanda senza coinvolgere utilità esterne.
Quindi, il meglio che -perm
può fare (da solo) è un'approssimazione di -executable
. Forse un'approssimazione più vicina di quanto non lo -perm +111
sia-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 -L
per 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 exec
non è 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
-perm
primario conforme a POSIX (noto come test in GNU find terminology).
-perm
ti 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 a
per fare riferimento a tutte e tre. Permessi vengono indicati come x
per 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' chmod
utilità .
- 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
-a
per AND (GNU find e BSD find consentono anche -and
)
-o
per 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 -x
seguito, ma non ha senso farlo).
- Utilizzare
,
per partecipare a modalità parziali; E la logica è implicita; ad esempio, -u=x,g=x
significa 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
-perm
espressione 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 -o
e 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
-L
ordina a find di valutare gli obiettivi dei collegamenti simbolici invece dei collegamenti simbolici stessi; quindi, senza -L
, -type f
ignorerebbe 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 -executable
da a man find
partire 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.