CHMOD - Anwenden unterschiedlicher Berechtigungen für Dateien und Verzeichnisse


9

Ich habe versucht, die Berechtigungen für ein paar Boxen zu bereinigen, und habe den chmod-Mann sowie die gesamte Internetdokumentation durchsucht, die ich ohne Glück bearbeitet habe - also los geht's.

Grundsätzlich habe ich ein Verzeichnis mit vielen Unterverzeichnissen und Dateien - und ich möchte die folgenden Berechtigungen festlegen:

Für Verzeichnisse: 770 (u + rwx, g + rwx, o-rwx)

Für Dateien: 660 (U + rw, g + rw, ax, o-rw)

Ich möchte versuchen, dies nach Möglichkeit mit einem einzigen rekursiven chmod zu tun, um zu vermeiden, dass jedes Verzeichnis erneut durchlaufen wird und Datei-für-Datei-Berechtigungen festgelegt werden.

Ich kann mir vorstellen, dass es einen Weg geben muss, dies zu tun, ohne ein eigenes Shell-Skript zu schreiben - aber ich konnte nichts finden.

Ich schätze Ihre Hilfe!

Antworten:


10

Ich finde ein Skript nützlich, da es oft nützlich ist, sowohl Datei- als auch Verzeichnisberechtigungen auf einen Schlag zu ändern, und sie oft verknüpft sind. 770 und 660 für gemeinsam genutzte Verzeichnisse auf einem Dateiserver, 755/644 für Webserververzeichnisse usw. Ich behalte ein Skript mit dem am häufigsten verwendeten Modus für diesen Servertyp in der Datei bin / und führe die Suche nur manuell durch, wenn dies gemeinsam der Fall ist Modus gilt nicht.

#!/bin/sh
# syntax: setperm.s destdir
#
if [ -z $1 ] ; then echo "Requires single argument: <directoryname>" ; exit 1 ;                                       fi

destdir=$1

dirmode=0770
filemode=0660

YN=no

printf "\nThis will RECURSIVELY change the permissions for this entire branch:\n                                      "
printf "\t$destdir\n"
printf "\tDirectories chmod = $dirmode\tFiles chmod = $filemode\n"
printf "Are you sure want to do this [$YN]? "

read YN

case $YN in
        [yY]|[yY][eE][sS])
        # change permissions on files and directories.
        find $destdir -type f -print0 | xargs -0 chmod $filemode $i
        find $destdir -type d -print0 | xargs -0 chmod $dirmode $ii ;;

        *) echo "\nBetter safe than sorry I always say.\n" ;;
esac

Beeindruckend! Genau das habe ich gesucht. Vielen Dank!
Skone

Hey iPaulo - kannst du zufällig das "$ ii" in der Zeile "find $ destdir -type d -print0 | xargs -0 chmod $ dirmode $ ii ;;" erklären. Ich bin nicht sicher, ob ich verstehe, warum es nicht einfach "find $ destdir -type d -print0 | xargs -0 chmod $ dirmode $ i ;;" Vielen Dank!
Skone

18

Keine Notwendigkeit für Skripte.

// Verzeichnisse:

find . -type d -exec chmod XXX {} \;

// Dateien:

find . -type f -exec chmod XXX {} \;

16

In Ihrem Fall muss es möglicherweise nicht so kompliziert sein, wie andere es sich vorgestellt haben (obwohl findes in der Tat ein gutes Werkzeug für solche Dinge im Allgemeinen ist). Der Unterschied zwischen den Modi ist das Ausführungsbit. Wenn für keine Dateien bereits das Ausführungsbit gesetzt ist, können Sie dies in einem einzigen Aufruf von tun chmod, genau wie Sie es gewünscht haben.

chmod -R u=rwX,g=rwX,o= FILE...

Der Schlüssel hier ist das Kapital X, das auf der Manpage erklärt wird

Ausführen / Suchen nur, wenn die Datei ein Verzeichnis ist oder bereits Ausführungsberechtigung für einen Benutzer hat.

Wenn für Ihre Dateien das Ausführungsbit noch nicht gesetzt ist, wird es nur für Verzeichnisse gesetzt.


Das ist großartig, aber viel länger als nur 777 zu schreiben. Gibt es eine Abkürzung für -X?
Elliott B

4

Zumindest für meinen Anwendungsfall war rsyncdas Kopieren des Verzeichnisses auf sich selbst viel schneller als das chmoddirekte Verwenden mit einer Liste von Dateien aus find.

rsync -rpt --chmod=D770,F660 . .

Wenn Sie chowndem gleichen Vorgang ein hinzufügen möchten , rsynckönnen Sie dies auch mit der --chown=user:groupOption tun .


Whoah, das ist eigentlich viel schneller als chmod -R.
Epeli

1

Sauber und einfach:

chmod 660 $(find . -type f)
chmod 770 $(find . -type d)

Sehr eleganter Ansatz.
user5336

3
Vielleicht, aber beachten Sie, dass dies nur funktioniert, wenn die Dateien keine Leerzeichen enthalten. Ein "sicherer" Ansatz istfind ... -exec chmod ... {} \;
isaaclw
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.