Ok, ho riletto le pagine man "chmod" per Mac OS X, BSD e Linux e ho fatto alcuni esperimenti. Ecco cosa ho imparato sulle modalità simboliche. Può essere complicato, ma vale la pena capire:
- La forma generale è la clausola [, clausola ...] dove:
- clausola : = [ugoa] [+ - =] [rwxXstugo]
- [ugoa] ( who ) (specificare più) significa impostare l'autorizzazione per utente, gruppo, altro o tutti. Se non specificato, il valore predefinito è 'a', ma la umask è attiva.
- [+ - =] ( azione ) (specificarne uno) significa:
- + significa aggiungere le autorizzazioni specificate alle autorizzazioni già in vigore
- - significa rimuovere le autorizzazioni specificate dalle autorizzazioni già in vigore
- = significa impostare le autorizzazioni sulle autorizzazioni specificate, cancellando tutte le altre
- [rwxXstugo] ( autorizzazione ) (specifica il multiplo di rwxXst O uno di ugo) imposta le autorizzazioni per gli utenti specificati come segue:
- r - leggi
- w - scrivi
- x - esegue / cerca
- X: esegue / cerca nella directory iff O qualsiasi bit di esecuzione era già impostato.
- s - suid o sgid
- t - appiccicoso
- u - copia il permesso dell'utente
- g - copia l'autorizzazione del gruppo
- o - copia altri permessi
Quindi, per esempio, a+x
renderebbe un file eseguibile da tutti. a+X
renderebbe un file eseguibile da tutti SE fosse stato eseguibile da chiunque.
a+x
renderebbe una directory ricercabile da tutti. a+X
renderebbe anche una directory ricercabile da tutti.
La differenza chiave tra BSD e Linux è che con BSD, la determinazione viene effettuata in base alle autorizzazioni del file prima dell'esecuzione di chmod. Mentre con Linux, la determinazione viene effettuata immediatamente prima dell'esecuzione della clausola + X.
Quindi con BSD, la combinazione a-x,a+X
rimuoveva i permessi di esecuzione / ricerca e quindi rendeva una directory ricercabile da tutti, e rendeva un file eseguibile da tutti se fosse stato originariamente eseguibile da chiunque.
Con Linux, a-x,a+X
rimuoverei i permessi di esecuzione / ricerca e renderebbe una directory ricercabile da tutti, lasciando un file eseguibile da nessuno.
Ecco un esempio concreto: su una macchina BSD: una directory, un file eseguibile e un file non eseguibile:
drwxr-x--- 2 falk staff 68 Jul 19 18:01 fee/
-rwxr-x--- 1 falk staff 0 Jul 19 18:01 fie*
-rw-r----- 1 falk staff 0 Jul 19 18:01 foe
Si noti che sia la directory che "fie" sono eseguibili / ricercabili dall'utente, ma non da altri.
Ora eseguiamo chmod a-x,a+X *
. La prima clausola eliminerà il bit di esecuzione / ricerca da tutti gli utenti per tutti i file, ma la seconda clausola lo aggiungerà sia per "fee" che per "fie". "fee" perché è una directory, e "fie" perché aveva almeno un bit eseguibile per cominciare.
drwxr-x--x 2 falk staff 68 Jul 19 18:01 fee/
-rwxr-x--x 1 falk staff 0 Jul 19 18:01 fie*
-rw-r----- 1 falk staff 0 Jul 19 18:01 foe
Ho avuto lo stesso risultato nell'esecuzione chmod -x+X
.
Conclusione: la soluzione di Jak Gibb funzionerà su Linux, ma per BSD dovresti fare due passaggi.
Non ho provato questo su SVr4 o altre varianti Unix.