È necessario correggere le autorizzazioni per i file nella home directory di un utente


24

Qualcuno ha uno strumento o uno script che correggerà in modo ricorsivo i permessi dei file su una directory?

Su una macchina Ubuntu Linux, un mucchio di file è stato copiato su un disco USB con 777 autorizzazioni complete (utente, gruppo, altro - lettura, scrittura, esecuzione) per errore. Voglio rimetterli nella directory dell'utente corretta.

Le directory dovrebbero essere 775 e tutti gli altri file possono essere 664. Tutti i file sono immagini, documenti o MP3, quindi nessuno di essi deve essere eseguibile. Se il bit della directory è impostato, allora ha bisogno di essere eseguito, in altre parole ha solo bisogno di utente e gruppo, leggere e scrivere.

Ho pensato che valesse la pena verificare se esiste una tale utilità prima di hackerare insieme uno script di shell :)


Risposte:


51

Questo dovrebbe fare il trucco:

find /home/user -type d -print0 | xargs -0 chmod 0775
find /home/user -type f -print0 | xargs -0 chmod 0664

1
+1 per l'utilizzo di -print0 / xargs -0 :-).
sleske,

14

find può fare il trucco da solo con -exec:

find /home/user -type f -exec chmod 0664 {} \;
find /home/user -type d -exec chmod 0775 {} \;

per impedire a find di generare un chmod per ogni voce:

find /home/user -type f -exec chmod 0664 {} +
find /home/user -type d -exec chmod 0775 {} +

(questo chiama effettivamente chmod una volta con l'elenco di tutti i file come parametri anziché un chmod per file)


6
Più lento rispetto all'utilizzo di xargs, poiché si sta eseguendo il fork di un chmod per ogni file, in quanto xargs eseguirà un processo chmod con tutti i file che può stare su una riga di comando. Su un albero molto grande, questo può fare la differenza.
David Pashley,

1
Inoltre, print0 / xargs -0 gestirà anche nomi di file molto strani; non sono così sicuro di trovare -exec.
sleske,

8

Questa risposta non risolverà il tuo problema, ma qualcuno potrebbe trovarlo utile per un problema simile in cui i file hanno meno permessi di quanto dovrebbero fare.

# chmod -R . u=rwX,g=rX,o=rX

La magia è l'autorizzazione X, piuttosto che x. La manpage di chmod la descrive così:

esegui / cerca solo se il file è una directory o ha già i permessi di esecuzione per alcuni utenti

Questo non è adatto nel tuo caso poiché i tuoi file hanno i permessi di esecuzione, quindi corrisponderanno al secondo test.


1
g dovrebbe essere rwX per 775 e 664.
aventurin,

1

Ho creato uno script dalla soluzione di freiheit, che aggiunge il controllo degli argomenti di base.

#!/bin/sh

if [ $# -lt 1 ]; then
    echo "USAGE: $0 <path>"
    exit 1
fi

find $1 -type d -print0 | xargs -0 chmod 0755
find $1 -type f -print0 | xargs -0 chmod 0644

Buona idea. Tuttavia, la seconda linea genera un errore quando il bersaglio è una directory: chmod: missing operand after ‘0644’. Posso suggerire di racchiudere le istruzioni find con un segno di spunta per vedere se esiste la destinazione? if [ -d $1 ]; then find $1 -type d -print0 | xargs -0 chmod 0755; fi; if [ -f $1 ]; then find $1 -type f -print0 | xargs -0 chmod 0644; fi
Underverse

È quasi corretto; ma se la destinazione è una directory, hai dimenticato di chmod i file in essa contenuti e, se è un file, devi solo chmod solo quel file.
sean,

0

Nel caso in cui usi ssh, è una buona idea non modificare le ~/.sshautorizzazioni.

DIR=/home/user
find $DIR -type d -not -path "$DIR/.ssh" -print0 | xargs -0 chmod 0775
find $DIR -type f -not -path "$DIR/.ssh/*" -print0 | xargs -0 chmod 0664

0

L'altro giorno ho realizzato uno script bash davvero semplice perché avevo bisogno di correggere i permessi. Perché non esiste un'utilità formale per ripristinare le autorizzazioni di base, non root, per file e cartelle?

Lo script usa find per 755 tutte le cartelle e 644 librerie. Quindi verifica ogni file con se stesso per vedere se ha un'intestazione elfo binaria. In caso contrario, esegue la scansione dei primi due personaggi alla ricerca di shebang#! . 755 quelle istanze e 644 tutto il resto dopo che controlla per vedere se il file ha già l'autorizzazione corrispondente.

I casi speciali vengono gestiti con un'eccezione come *.bakper i file da ignorare.

#!/bin/bash
read -r -p "Correct file and folder permissions? [y/N] " chse
if [[ "$chse" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
  echo "Processing ..."
  find -H $(pwd) -type d -exec chmod 0755 {} \;
  # set dirs to 755
  find -H $(pwd) -type f \( -iname '*.so.*' -o -iname '*.so' \) -exec chmod 0644 {} \;
  # libs
  IFS=$'\n'
  for value in $(find -H $(pwd) -type f ! \( -iname '*.so.*' -o -iname '*.so' -o -iname '*.bak' \) -printf '%p\n'); do
    tstbin=$(readelf -l "$value" 2>/dev/null | grep -Pio 'executable|shared')
    if [ -z "$tstbin" ]; then
      tstbat=$(cat "$value" | head -c2 | grep -io '#!')
      if [ -n "$tstbat" ]; then
        perm=$(stat -c '%a' "$value")
        if [ "$perm" != "755" ]; then
          chmod 755 $value
          echo "Set script  755 $value"
          # set batch to 755
        fi
      else
        perm=$(stat -c '%a' "$value")
        if [ "$perm" != "644" ]; then
          chmod 644 $value
          echo "Set regular 644 $value"
          # set regular files to 644
        fi
      fi
      # above aren't elf binary
    else
      perm=$(stat -c '%a' "$value")
      if [ "$perm" != "755" ]; then
        chmod 755 $value
        echo "Set binary  755 $value"
        # set elf binaries to 755
      fi
    fi
  done
  unset IFS
  # process linux permissions for files and folders
else
  echo "Aborted."
fi

0

Ho trovato una soluzione C-shell semplificata. Questo potrebbe non essere completamente a prova di errore ma dovrebbe funzionare per la maggior parte delle directory. Presuppone che il comando 'file' di Unix funzioni e trova i file exec per ripristinarli alle autorizzazioni exec:

find /home/user -type d | xargs chmod 0775
find /home/user -type f | xargs -0 chmod 0664
find /home/user -type f -exec file {} \; | grep executable | cut -d":" -f1 | xargs chmod 0775

1
Questo non solo ripete alcune delle risposte, introduce un errore e una funzionalità che l'OP non ha richiesto.
RalfFriedl,

0

Un'alternativa, che non risponde esattamente alla richiesta originale, ma è più probabile ciò che l'OP intende, è quella di specificare le autorizzazioni in modo simbolico. Ad esempio, presumo che OP voglia "rimuovere l'accesso in scrittura per il pubblico e rimuovere l'autorizzazione eseguibile da tutti i file".

Ciò è possibile se si utilizza la rappresentazione di autorizzazione simbolica.

  • ow è "rimuovi l'accesso in scrittura dal pubblico" ("o" - others "," - remove, "w" - write)
  • ax è "rimuovi esegui solo per tutti i file" ("a" - all, "-" - rimuovi, "x" - esegui)

Scrivendolo in questo modo invece di impostare esplicitamente "0664" eviti di consentire accidentalmente autorizzazioni extra ai file precedentemente bloccati. Ad esempio, se un file era 0770 non diventerà 0664 per errore.

Per fare il primo requisito puoi semplicemente usare chmod:

chmod --recursive o-w $dir

Per fare il secondo requisito:

find $dir -type f -exec chmod a-x {} +

O per fare entrambe le cose:

find $dir -type f -exec chmod a-x,o-w {} +
find $dir -type d -exec chmod o-w {} +
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.