Ho accidentalmente chmod -R + x su una directory. Come ripristinare le autorizzazioni corrette?


20

Beh, per essere precisi, lo era chmod -R 755. Ora ogni file è eseguibile, cosa che non voglio. Sto pensando che dovrei guardare i primi due byte di ogni file per il #!, ma questo coprirà tutto? Dovrei invece usare fileper guardare tutto e basare la mia decisione su quello? O, più probabilmente, esiste un modo ancora migliore per farlo?

Qual è il modo preferito di ricorrere in modo ricorsivo a una directory e impostare -x su file che non dovrebbero essere "eseguibili"?


Hai fatto questo in /un'altra directory?
gvkv,

1
@gvkv: No /, una directory completamente di mia proprietà.
Larry Wang,

1
@Larry in futuro dovresti probabilmente usare una variante di + x piuttosto che stuprare tutte le autorizzazioni e possibilmente causare scritture su tutti i file.
xenoterracide,

@xenoterracide: concordato. Quello che volevo davvero era dare al mio gruppo le stesse autorizzazioni (cosa che alla fine è successa!), Non ho fatto abbastanza per pensare prima di scrivere.
Larry Wang,

Di quanti file stiamo parlando? Quanti dovrebbero essere eseguibili? C'è un modo per distinguerlo dai nomi dei file?
David Thornley,

Risposte:


15

Non c'è proiettile magico qui. Le autorizzazioni contengono informazioni che non sono sempre ridondanti.

Se lo avessi fatto in una directory di sistema, il tuo sistema sarebbe in pessimo stato, perché dovresti preoccuparti dei bit setuid e setgid e dei file che non dovrebbero essere leggibili dal mondo e dei file che dovrebbero essere scrivibili in gruppo o nel mondo.

In una directory per utente, devi preoccuparti di file che non dovrebbero essere leggibili in tutto il mondo. Nessuno può aiutarti lì.

Per quanto riguarda l'eseguibilità, una buona regola empirica sarebbe quella di rendere non eseguibile tutto ciò che non sembra possa essere eseguito. Il kernel può eseguire script i cui primi due byte sono #!, binari ELF i cui primi quattro byte sono \x7fELFdov'è \x7fil byte con il valore 12 e alcuni tipi di file più rari (a.out, qualsiasi cosa registrata binfmt_misc). Quindi il seguente comando dovrebbe ripristinare le tue autorizzazioni a uno stato ragionevole (presuppone che bash 4 o zsh, altrimenti usi findper attraversare l'albero delle directory; avviso, digitato direttamente nel browser):

for x in **/*; do
  if ! [ -f "$x" ]; then continue; fi # skip all but regular files
  case $(head -c 4 "$x") in
    "#!"??) :;; # skip script
    "\x7fELF") :;; # skip ELF executable
    *) chmod a-x "$x";;
  esac
done

Si noti che esiste un modo semplice per eseguire il backup e il ripristino delle autorizzazioni di un albero di directory, su Linux e possibilmente su altri unice con supporto ACL:

getfacl -R >saved-permissions
setfacl --restore=saved-permissions

Grazie! Fortunatamente, penso che tutto rientri in queste due categorie. Se questo manca qualcosa, posso occuparmene più tardi.
Larry Wang,

Tieni presente che **/*richiede globstar.
Chris Down,

Consiglierei due modifiche a questo script. Uno, usa findpiuttosto che globstar; due, invece di guardare la testa, usa il filecomando per vedere di cosa si tratta e ramifica da lì.
Shadur,

@Shadur findè meno affidabile di globstar, globstarè preferibile in quasi tutti i casi.
Chris Down,

1
@Gilles Preferibile come in "se ce l'hai, è di gran lunga superiore", non solo è più veloce, è anche più affidabile (e non ha SNAFU inaspettati).
Chris Down,

6

Credo che vorrai qualcosa del genere

find dir -type f -exec chmod ugo-x '{}' +

Questo cerca tutti i file regolari, ricorsivamente in dir, (esclude directory e dispositivi) e rimuove il bit eseguibile.

Vorrei iniziare da qui, e poi lavorare per creare file che dovrebbero essere eseguibili, eseguibili.

Quanto segue dovrebbe funzionare esattamente come richiesto (troverà tutti i file regolari, grep per #! E quindi rimuovere i bit x se non trovati)

find . -type f | xargs grep -L #! | xargs chmod ugo-x

forse una versione migliore di quanto sopra (meno tubi)

find . -type f -exec grep -L #! '{}' + | xargs chmod ugo-x 

3
Fallo grep -L '^#!'almeno (le virgolette sono necessarie e ^limita la corrispondenza all'inizio della riga), ma è ancora troppo permissivo in quanto corrisponde #!su qualsiasi riga. L'uso xargsfallirà con nomi di file contenenti spazi o caratteri di virgoletta; uso xargs -d '\n'(richiede GNU xargs).
Gilles 'SO- smetti di essere malvagio' il

0

Bene, senza una riga shebang, il file verrà eseguito come uno script di shell, nominalmente con /bin/sh. La tua idea è un buon inizio e supponendo che la directory in questione non contenga file mission-critical, probabilmente non c'è molto rischio nell'esecuzione di alcuni grepe chmodcombo. È possibile riscontrare falsi positivi, ovvero file con una riga shebang che non sono pensati per avere il bit eseguibile impostato ma senza conoscere ulteriori informazioni sullo scopo di ciò che è nella directory, solo tu puoi decidere se ciò rappresenta una minaccia esistenziale significativa per il tuo sistema e / o dati.


Non mi preoccupo tanto dei falsi positivi quanto dei falsi negativi. Ci sono binari con cui non credo inizi #!.
Larry Wang,
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.