Frage Sie müssen die Dateiberechtigungen im Basisverzeichnis eines Benutzers korrigieren


Hat jemand ein Werkzeug oder ein Skript, das die Dateiberechtigungen für ein Verzeichnis rekursiv korrigiert?

Auf einem Ubuntu Linux-Rechner wurden eine Reihe von Dateien fälschlicherweise auf einen USB-Datenträger mit vollen 777 Berechtigungen (Benutzer, Gruppe, andere - lesen, schreiben, ausführen) kopiert. Ich möchte sie im Benutzerverzeichnis korrigieren.

Verzeichnisse sollten 775 und alle anderen Dateien 664 sein. Alle Dateien sind Bilder, Dokumente oder MP3s, so dass keine davon ausführbar sein muss. Wenn das Verzeichnisbit gesetzt ist, muss es ausgeführt werden, ansonsten braucht es nur Benutzer und Gruppe, Lesen und Schreiben.

Ich dachte mir, dass es sich lohnt zu prüfen, ob ein solches Hilfsprogramm existiert, bevor man ein Shell-Skript zusammenhackt :)


18
2017-07-02 14:58


Ursprung


Hier ist eine, die ich früher gemacht habe: http://timwise.blogspot.com/2008/08/reseting-home-folder-permissions-in.html - Tim Abell


Antworten:


Dies sollte den Trick machen:

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

43
2017-07-02 15:04



+1 für die Verwendung von -print0 / xargs -0 :-). - sleske


Finden kann den Trick alleine mit -exec:

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

um zu verhindern, dass find für jeden Eintrag ein chmod erzeugt:

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

(Dies ruft effektiv chmod einmal mit der Liste aller Dateien als Parameter und nicht als ein chmod pro Datei auf)


11
2017-07-02 15:14



Langsamer als die Verwendung von xargs, da Sie für jede Datei einen chmod forkieren, wobei xargs einen chmod-Prozess mit so vielen Dateien ausführt, wie er in eine Befehlszeile passen kann. Auf einem sehr großen Baum kann dies einen großen Unterschied machen. - David Pashley
Print0 / xargs -0 verarbeitet auch sehr seltsame Dateinamen. Ich bin mir nicht so sicher, ob ich -exec finde. - sleske


Diese Antwort wird Ihr Problem nicht lösen, aber jemand könnte es für ein ähnliches Problem nützlich finden, wo Dateien weniger Berechtigung haben, als sie sollten.

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

Die Magie ist die X-Erlaubnis, anstatt x. Die chmod-Manpage beschreibt es so:

Ausführen / Suche nur, wenn die Datei ein Verzeichnis ist oder bereits Ausführungsrechte für einen Benutzer hat

Dies ist in Ihrem Fall nicht geeignet, da Ihre Dateien eine Ausführungsberechtigung haben, so wird der zweite Test übereinstimmen.


5
2017-07-02 15:42



g sollte rwX für 775 und 664 sein. - aventurin


Ich habe ein Skript aus der Freiheitslösung gemacht, es fügt grundlegende Argumente hinzu.

#!/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

1
2018-01-24 18:07



Gute Idee. Die zweite Zeile gibt jedoch einen Fehler aus, wenn das Ziel ein Verzeichnis ist: chmod: missing operand after ‘0644’. Kann ich vorschlagen, die Find-Anweisungen mit einem Häkchen zu versehen, um zu sehen, ob das Ziel existiert? 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


Wenn Sie ssh verwenden, ist es ratsam, nicht zu ändern ~/.ssh Berechtigungen.

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
2017-11-12 14:25





Ich habe neulich ein wirklich einfaches Bash-Skript erstellt, weil ich Berechtigungen reparieren musste. Warum gibt es kein formales Dienstprogramm zum Zurücksetzen von Berechtigungen für Basis-, Nicht-Root-, Datei- und Ordnerrechte?

Das Skript verwendet find zu 755 alle Ordner und 644 Bibliotheken. Es testet dann jede Datei mit readelf, um zu sehen, ob es einen binären Elf-Header hat. Wenn nicht, scannt es die ersten zwei Zeichen für Shebang #!. Es 755 diese Instanzen und 644 alles andere nach es überprüft, ob die Datei bereits die entsprechende Berechtigung hat.

Sonderfälle werden mit einer Ausnahme behandelt wie die *.bak für Dateien, die ignoriert werden sollen.

#!/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
2017-07-21 22:37