Come rimuovere in modo ricorsivo le autorizzazioni di esecuzione dai file senza toccare le cartelle?


42

Ho fatto un backup su un'unità NTFS e, bene, questo backup si è rivelato davvero necessario. Tuttavia, l'unità NTFS ha incasinato le autorizzazioni. Vorrei ripristinarli al normale senza riparare manualmente ogni singolo file.

Un problema è che improvvisamente tutti i miei file di testo acquisiti eseguono le autorizzazioni, il che è spesso sbagliato. Quindi ho provato:

sudo chmod -R a-x folder\ with\ restored\ backup/

Ma è sbagliato in quanto rimuove anche il xpermesso dalle directory che li rende illeggibili.

Qual è il comando corretto in questo caso?


1
Meta: Non ho mai capito perché i sistemi Unix aggiungano il bit di esecuzione ai file montati da file system DOS o Windows. Non è che nessuno eseguirà mai quei file. In genere aggiungo "noexec" alle mie opzioni di montaggio ovunque sia pratico.
Edward Falk,

Risposte:


70
chmod -R -x+X *

I -xrimuove autorizzazioni di esecuzione per tutto
il +Xaggiungerà i permessi di esecuzione per tutti, ma solo per le directory.


2
Il comando che alla fine ho usato per ripristinare le normali autorizzazioni: `chmod -R a-x + X, u-x + rwX, go-wx + rX directory /
name`


4
Ciò non soddisfa il requisito "senza toccare le cartelle". E se l'esecuzione (forse per il mondo) fosse stata intenzionalmente rimossa in alcune directory? Non dovresti aggiungerlo.
Ben Voigt,

4
questo non ha funzionato su Mac. Spostando il flag -R all'inizio, questo funzionerà in entrambi i terminali Linux e Mac. chmod -R -x+x *
JoeMoe1984,

2
In realtà con l'ordine corretto funziona su OSX, ma in realtà non ha l'effetto desiderato. Devi farlo in due passaggi separati:chmod -R -x * && chmod -R +X *
Timmmm,

14

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+xrenderebbe un file eseguibile da tutti. a+Xrenderebbe un file eseguibile da tutti SE fosse stato eseguibile da chiunque.

a+xrenderebbe una directory ricercabile da tutti. a+Xrenderebbe 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+Xrimuoveva 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+Xrimuoverei 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.


Buona lettura Grazie per aver fatto la ricerca in questo.
Jak Gibb,

10

Un modo per farlo:

find backup -type f -exec chmod 0644 {} +

6
Ciò potrebbe comportare l'aggiunta o la rimozione di autorizzazioni che non si desidera modificare. Meglio usarechmod a-x {}
Edward Falk,

1
@EdwardFalk chmod a-x {}potrebbe anche finire con la rimozione delle autorizzazioni che non desideri modificare e potrebbe lasciare file scrivibili in tutto il mondo. Il punto è che 0644 è un compromesso "generalmente ragionevole". Ovviamente l'OP dovrebbe coinvolgere anche il cervello prima di applicare soluzioni da Internet sul suo computer.
Satō Katsura,

4
"ax" rimuove le autorizzazioni di esecuzione per utente, gruppo, altro e lascia invariate le altre autorizzazioni, per quanto ne so. Ho sbagliato?
Edward Falk,

1
@EdwardFalk No, hai ragione. Ma non sai quale sia realmente il set di file e non sai quali siano le autorizzazioni prima chmod. Se i file di backup contengono script e file binari, la xloro rimozione è errata. Se le autorizzazioni precedenti chmodsono 0777 chmod a-x, le lasceranno comunque 0666, che probabilmente non è quello che desideri. Quello che sto dicendo è che l' chmod 0644euristica è migliore, non chmod a-xè sbagliato.
Satō Katsura,

1
@NajibIdrissi Tranne quando, sai, sono cambiati in 0777 quando li hai copiati su un filesystem esterno che non ha i permessi UNIX. È esattamente ciò che ha fatto l'OP.
Satō Katsura,

6
 find backup ! -type l ! -type d -exec chmod a-x {} +

Rimuoverebbe i permessi di esecuzione su file che non sono di tipo directory (come richiesto) né collegamenti simbolici (i collegamenti simbolici sono generalmente sempre rwxrwxrwx e chmodinfluirebbero sulla destinazione del collegamento simbolico su di essi).

Nota che:

 find backup -type f -exec chmod a-x {} +

cambierebbe solo l'autorizzazione dei file normali . Ciò escluderebbe directory e collegamenti simbolici , ma anche dispositivi , named pipe , socket e forse altri a seconda del sistema (anche se nel caso dell'OP di un backup di un file system NTFS, è improbabile che siano presenti).


2

In zsh, usa il qualificatore glob . per abbinare solo i file regolari (esclusi i collegamenti simbolici) e Dper abbinare i file dot:

sudo chmod a-x folder\ with\ restored\ backup/**/*(D.)

Se la riga di comando è troppo lunga, è possibile utilizzare zargs:

zargs -- folder\ with\ restored\ backup/**/*(D.) -- sudo chmod a-x 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.