Setzen Sie die Berechtigungen auf die Standardeinstellungen zurück

10

Wie kann ich die Berechtigung gemäß der Maske auf die Standardeinstellung zurücksetzen, damit für sie Berechtigungen festgelegt werden, wenn die Datei gerade erstellt wurde?

Beispiel für das, was ich erreichen möchte: umaskist also auf 0022 gesetzt

touch file
mkdir directory

Die Berechtigungen der Datei sind jetzt rw-r--r--

Die Berechtigungen des Verzeichnisses sind jetzt rwxr-xr-x

chmod 777 file
chmod 777 directory

Die Berechtigungen der Datei sind jetzt rwxrwxrwx

Die Berechtigungen des Verzeichnisses sind jetzt rwxrwxrwx

Gibt es eine Möglichkeit, die Dauerwellen auf die Standardeinstellungen zurückzusetzen, damit die Datei rw-r--r--und das Verzeichnis rwxr-xr-xverwendet werden chmod?

Ich schaue
quelle

Antworten:

6

In zsh können Sie einfach das umaskvon 0666für Dateien und 0777Verzeichnisse subtrahieren , um Standardberechtigungen zu erhalten:

$ printf "%04d\n" "$((0777 - $(umask)))"
0755
$ printf "%04d\n" "$((0666 - $(umask)))"
0644

Dementsprechend können Sie sich bewerben chmod:

chmod $((0666 - $(umask))) file
chmod $((0777 - $(umask))) directory

In Bash müssen Sie verwenden printf, um die Ausgabe in Oktal zu erzwingen:

$ printf "%04d\n" "$((0777 - $(umask)))"
0493
$ printf "%04o\n" "$((0777 - $(umask)))"
0755

Eine andere Möglichkeit wäre, eine neue Datei und ein neues Verzeichnis zu erstellen und diese als Referenz zu verwenden:

touch file2
mkdir directory2 
chmod --reference=directory2 directory
chmod --reference=file2 file
muru
quelle
2
Ich fand auch so etwas wie chmod =rwx file, nicht sicher, was genau es tut, aber es sieht so aus, als würde es die Berechtigungen auf die Standardeinstellungen zurücksetzen, aber nur für Verzeichnisse
siehe
6

Die Masken werden bitweise ANDmit der bitwise negatedMaske angewendet. Wenn Sie also Ihren eigenen endgültigen Berechtigungsmodus erstellen möchten, können Sie Folgendes tun:

$((mode & ~umask))

Sie müssen das oktal zurückdrucken, damit Sie es weitergeben können an chmod:

$ chmod `printf '%o' $((0777 & ~$(umask)))` directory
$ chmod `printf '%o' $((0777 & ~0111 & ~$(umask)))` file
#^additional implicit mask of 0111 for files

Dabei ist 0777 der Berechtigungsmodus, auf den Sie die Maske anwenden möchten (Sie können sie mit stat -c %a fileoder erhalten stat -c %a directory).

Sie können das oben Gesagte wiederholen, um zu sehen, wie die Prozessersetzung ausgewertet wird (für eine umaskvon erhalten 0022Sie 755und 644).

Sie könnten eine generische Funktion daraus machen:

#takes a umask as first param and applies it to each folowing param (files)
maskMode(){
  local mask="$1" dmask mode a
  dmask="$((mask & ~0111))"; shift
  for a; do
    mode=0`stat -c "%a" "$a"`
    chmod `printf "%0.4o\n" $(($mode & ~mask))` "$a"
  done
}

Für Ihre spezielle Verwendung sind chmod-Referenzdateien eine weitere Option.

PSkocik
quelle