Sie müssen die Dateiberechtigungen im Basisverzeichnis eines Benutzers korrigieren


24

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

Auf einem Ubuntu Linux-Computer wurden eine Reihe von Dateien mit vollen 777-Berechtigungen (Benutzer, Gruppe, Sonstiges - Lesen, Schreiben, Ausführen) fehlerhaft auf ein USB-Laufwerk kopiert. Ich möchte sie wieder in das korrigierte Benutzerverzeichnis stellen.

Die Verzeichnisse sollten 775 sein und alle anderen Dateien können 664 sein. Alle Dateien sind Bilder, Dokumente oder MP3s, daher muss keine von ihnen ausführbar sein. Wenn das Verzeichnisbit gesetzt ist, muss es ausgeführt werden, andernfalls nur Benutzer und Gruppe, Lesen und Schreiben.

Ich dachte, es lohnt sich zu prüfen, ob ein solches Dienstprogramm existiert, bevor ich ein Shell-Skript zusammenstelle :)


Antworten:


51

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

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

14

find schafft es 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 einen chmod erzeugt:

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

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


6
Langsamer als die Verwendung von xargs, da Sie ein chmod für jede Datei angeben, wobei xargs einen chmod-Prozess mit so vielen Dateien ausführt, wie auf eine Befehlszeile passen. Bei einem sehr großen Baum kann dies einen deutlichen Unterschied machen.
David Pashley

1
Außerdem werden mit print0 / xargs -0 auch sehr seltsame Dateinamen verarbeitet. Ich bin mir nicht so sicher, was find -exec angeht.
sleske

8

Diese Antwort wird Ihr Problem nicht lösen, aber jemand könnte es für ein ähnliches Problem nützlich finden, bei dem Dateien weniger Berechtigungen haben als er sollte.

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

Die Magie ist die X-Erlaubnis und nicht x. Die chmod-Manpage beschreibt es so:

Ausführen / Suchen nur, wenn die Datei ein Verzeichnis ist oder für einen Benutzer bereits Ausführungsberechtigungen besitzt

Dies ist in Ihrem Fall nicht geeignet, da Ihre Dateien über die Ausführungsberechtigung verfügen und daher dem zweiten Test entsprechen.


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

1

Ich habe aus der Lösung von freiheit ein Skript erstellt, das eine grundlegende Argumentprüfung hinzufügt.

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

Gute Idee. Allerdings wirft die zweite Zeile einen Fehler , wenn das Ziel ein Verzeichnis ist: chmod: missing operand after ‘0644’. Kann ich vorschlagen, die find-Anweisungen mit einer Prüfung zu versehen, um festzustellen, ob das Ziel vorhanden ist? 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
Unterschreiten Sie den

Es ist fast richtig; Wenn das Ziel jedoch ein Verzeichnis ist, haben Sie vergessen, die darin enthaltenen Dateien zu ändern, und wenn es sich um eine Datei handelt, müssen Sie nur diese Datei ändern.
Sean

0

Wenn Sie ssh verwenden, sollten Sie die ~/.sshBerechtigungen nicht ändern .

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

Ich habe neulich ein wirklich einfaches Bash-Skript geschrieben, weil ich Berechtigungen korrigieren musste. Warum gibt es kein offizielles Dienstprogramm zum Zurücksetzen von Basis-, Nicht-Root-, Datei- und Ordnerberechtigungen?

Das Skript verwendet find to 755 alle Ordner und 644 Bibliotheken. Anschließend wird jede Datei mit readelf getestet, um festzustellen, ob sie einen binären Elf-Header enthält. Wenn nicht, werden die ersten beiden Zeichen nach Shebang durchsucht #!. Es 755 diese Instanzen und 644 alles andere, nachdem es überprüft, ob die Datei bereits die passende Berechtigung hat.

Sonderfälle werden mit einer Ausnahme wie die *.bakfür Dateien behandelt, 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

Ich habe eine vereinfachte C-Shell-Lösung gefunden. Dies ist möglicherweise nicht völlig idiotensicher, sollte aber für die meisten Verzeichnisse funktionieren. Es wird davon ausgegangen, dass der Unix-Befehl 'file' funktioniert, und es werden Exec-Dateien gefunden, um sie auf die Exec-Berechtigungen zurückzusetzen:

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
Dies wiederholt nicht nur einige der Antworten, sondern führt auch zu Fehlern und Funktionen, nach denen das OP nicht gefragt hat.
RalfFriedl

0

Eine Alternative, die die ursprüngliche Anfrage nicht genau beantwortet, aber mit größerer Wahrscheinlichkeit vom OP beabsichtigt wird, besteht darin, die Berechtigungen symbolisch anzugeben. Ich gehe zB davon aus, dass OP "den Schreibzugriff für die Öffentlichkeit und die ausführbare Berechtigung für alle Dateien entfernen" möchte.

Dies ist möglich, wenn Sie die symbolische Berechtigungsdarstellung verwenden.

  • ow ist "Schreibzugriff von der Öffentlichkeit entfernen" ("o" - andere, "-" - entfernen, "w" - schreiben)
  • ax ist "entfernen für alle nur für Dateien ausführen" ("a" - all, "-" - entfernen, "x" - ausführen)

Wenn Sie es so ausschreiben, anstatt "0664" explizit festzulegen, vermeiden Sie, dass Sie versehentlich zusätzliche Berechtigungen für Dateien gewähren, die zuvor gesperrt waren. Wenn eine Datei beispielsweise 0770 war, wird sie nicht versehentlich zu 0664.

Um die erste Anforderung zu erfüllen, können Sie einfach Folgendes verwenden chmod:

chmod --recursive o-w $dir

So führen Sie die zweite Anforderung aus:

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

Oder beides machen:

find $dir -type f -exec chmod a-x,o-w {} +
find $dir -type d -exec chmod o-w {} +
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.