So legen Sie umask für einen bestimmten Ordner fest

23

Aus offensichtlichen Gründen muss ich den umaskWert für einen bestimmten Ordner festlegen . Wie kann man das machen?

Vielen Dank im Voraus!

UPDATE 1

Der Grund, warum ich umask für einen bestimmten Ordner verwenden muss, ist folgender. Ich habe eine Webanwendung und beim Erstellen einer Datei ist die Standardberechtigung 700. Für diese Datei benötige ich jedoch mindestens 755 Berechtigungen. Ich denke, ich könnte das Problem jetzt klarer erklären.

Bakhtiyor
quelle
1
Die Gründe könnten für Sie offensichtlich sein, aber nicht für uns. Bitte teilen Sie uns mit, was Sie tun möchten.
htorque
@htorque. Der Grund, warum ich umask in meinem spezifischen Problem verwenden muss, wurde hinzugefügt.
Bakhtiyor

Antworten:

30

Du könntest benutzen setfacl

setfacl -d -m group:name:rwx /path/to/your/dir

Wo nameist der Gruppenname?

Um herauszufinden, welcher Gruppe Sie oder ein bestimmter Benutzer angehören, lesen Sie unter Unix / Linux, wie Sie über die Befehlszeile herausfinden, welcher Gruppe ein bestimmter Benutzer angehört.

yogi70
quelle
1
Vielleicht setfaclhat sich geändert. Ich erhalte die Fehlermeldung, dass dies -mkeine gültige Option ist.
Ryan Burnette
Ryan, setfaclist nicht verändert. Höchstwahrscheinlich haben Sie keinen richtigen Gruppennamen (nach -m) angegeben.
Sergk
1
ziemlich sicher setfaclist für Access Control Lists und nicht umask. Eine bessere Lösung aber eigentlich nicht was gefragt wurde, denke ich nicht.
Wyatt8740
try: sudo setfacl -Rdm ...(R für Rekursion weglassen) sollte funktionieren. @ Wyatt8740 (richtig). Um sicherzugehen, führen Sie Folgendes aus: man setfaclund geben Sie Folgendes ein /-modify. Sie müssen verwenden sudo.
27.
11

Sie können umask nicht pro Verzeichnis festlegen, da dies ein Wert auf Prozessebene ist. Wenn Sie verhindern möchten, dass andere Benutzer Dateien in einem Verzeichnis lesen, widerrufen Sie die entsprechenden Berechtigungsbits.

Wenn Sie beispielsweise ein Verzeichnis /home/user/directorymit einigen Dateien und Verzeichnissen haben, die Berechtigungen wie 777 von einem Prozess erhalten können, setzen Sie die Berechtigungsbits /home/user/directoryauf 700. Dadurch ist es für andere Benutzer (mit Ausnahme des Superuser-Stamms) nicht möglich, einen Abstieg durchzuführen in /home/user/directory.

Ich bin paranoid und setze die Berechtigungen auf /home/user750, sodass nur ich in meinem Home-Verzeichnis lesen, schreiben und absteigen kann. Dies hat zur Folge, dass Ordner wie /home/user/Publicfür andere nicht zugänglich sind, aber ich kann damit leben.


Per Update Ihrer Frage: Trotzdem können Sie nicht steuern, dass im Dateisystem (anders als bei Verwendung eines anderen Dateisystemtyps wie FAT, der stark entkoppelt ist), Sie dies in Ihrer Webanwendung tun müssen. Wenn Ihre Webapplikation in PHP programmiert ist, können Sie die umask mit der folgenden umaskFunktion im Handumdrehen ändern :

<?php
umask(0022);
// other code
?>

Sie können dies in eine Konfigurationsdatei einfügen, z. B. in die Datei, die das Kennwort für die Datenbankverbindung enthält (in Apps wie Wordpress).

Denken Sie daran, dass es sich um einen Prozesswert handelt. Bei einigen Webservern können Sie diesen in den Konfigurationsdateien festlegen. Andernfalls können Sie die Startskripte ändern, um die gewünschte Umask festzulegen. Denken Sie daran , dass die Berechtigungen wie 755und 644sind ziemlich gefährlich für Webapps, wenn der Code empfindlich ist, jeder kann es lesen.

Lekensteyn
quelle
Ich weiß, dass dies uralt ist, aber ich denke, es ist erwähnenswert: Der Administrator kann mount /home/user/Public( mount -o bind /home/user/Public /some/other/place) binden, um das Problem mit den Berechtigungen für das übergeordnete Verzeichnis zu umgehen.
Adrian Günter
1

Um die Berechtigungen für einen Ordner zu ändern, verwenden Sie chmod. umask ist für Dateien.

Setze umask auf das, was du brauchst

umask xxx

und ändere dich zurück, wenn du fertig bist

umask 022
wojox
quelle
11
umask = Dateien und Verzeichnisse, fmask = nur Dateien, dmask = nur Verzeichnisse. : P
htorque
1
Ich habe heute etwas Neues gelernt :)
wojox
1
Dies sind Optionen für bestimmte Dateisysteme wie NTFS (nicht für den Befehl zum Festlegen der Dateierstellungsmaske umask). Entschuldigung, dass Sie verwirrende Informationen hinzugefügt haben.
htorque
umask ändert die Dateierstellungsmaske für den aktuellen Prozess (die aktuelle Shell). Wenn eine andere Shell geöffnet ist oder ein Prozess im Besitz eines Benutzers ist, ist dies meines Erachtens nicht betroffen. Dieser Befehl wirkt sich auch auf alle anderen Dateien aus, die außerhalb des Verzeichnisses erstellt wurden, bis Sie es wieder ändern.
Dave
1

Eine andere Lösung könnte darin bestehen, die Gruppen-ID nur für Dateien festzulegen, die im Verzeichnis erstellt wurden. Dadurch werden die neuen Dateien in den Besitz der Verzeichnis-Gruppen-ID anstatt der Gruppen-ID des Benutzers versetzt, der die Dateien erstellt hat. Also ich denke du könntest einfach tun:

chown www-data:www-data /my/folder

chmod 4755 /my/folder

Dadurch wird die spezielle Dateiberechtigung setgid festgelegt, die dazu führt, dass alle in erstellten Dateien /my/folderder www-dataGruppe gehören, die dann aufgrund des übergeordneten Verzeichnisses über die Berechtigung rx (5) verfügt.

Bastiaan
quelle
2
Sie haben die GUID mit dem SUID-Oktalwert verwechselt
adampski
1

Stellen Sie eine andere Lösung bereit, die mit Schalenhaken und implementiert ist direnv. Die folgende Lösung ist möglicherweise kompatibler, falls setfaclsie auf Ihrem System nicht verfügbar ist. (zB macOS)

direnvist ein Environment Switcher für die Shell. Es weiß, wie man sich in bash, zsh, tcsh, fish shell und elvish einfügt, um Umgebungsvariablen abhängig vom aktuellen Verzeichnis zu laden oder zu entladen .

Verwenden Sie .envrcdiese exportOption, um den umaskWert für ein bestimmtes Verzeichnis anzupassen, und die Variable exported env wird entladen, wenn Sie dieses Verzeichnis verlassen.

# example .envrc file
export UMASK=0022

Definieren Sie einen Haken, um den umaskWert zu ändern , sobald das Arbeitsverzeichnis geändert wird.

function _umask_hook {
  if [[ -n $UMASK ]]; then
    umask "$UMASK"
  elif [[ $OSTYPE == darwin* ]]; then
    umask 0077
  else
    umask 0022
  fi
}

# To make the code more reliable on detecting the default umask
function _umask_hook {
  # Record the default umask value on the 1st run
  [[ -z $DEFAULT_UMASK ]] && export DEFAULT_UMASK="$(builtin umask)"

  if [[ -n $UMASK ]]; then
    umask "$UMASK"
  else
    umask "$DEFAULT_UMASK"
  fi
}

# zsh hooks
# trigger _umask_hook once working dir is changed
add-zsh-hook chpwd _umask_hook

# bash
# Append `;` if PROMPT_COMMAND is not empty
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND;}_umask_hook"

Derzeit unterstützt die Direnv-Hook-Initialisierung für zsh keinen chpwdHook. Wenn die Pull-Anforderung GH-514 nicht zusammengeführt wurde, wenn Sie diese Seite sehen. Bitte kommentieren Sie eval "$(direnv hook zsh)"und Haken direnvauf chpwdmanuell mit folgendem Code,

if (( $+commands[direnv] )) && ! (( $+functions[_direnv_hook] )); then
  _direnv_hook() {
    eval "$(command "direnv" export zsh)";
  }
  typeset -agU precmd_functions;
  if [[ -z ${precmd_functions[(r)_direnv_hook]} ]]; then
    precmd_functions=( _direnv_hook ${precmd_functions[@]} )
  fi

  typeset -agU chpwd_functions;
  if [[ -z ${chpwd_functions[(r)_direnv_hook]} ]]; then
    chpwd_functions=( _direnv_hook ${chpwd_functions[@]} )
  fi
fi

Quelle: dynamic-umask-based-on-cwd.md

Simba
quelle
0

Im Zusammenhang, aber in diesem Fall möglicherweise nicht zutreffend, stammt der folgende Clip von .zshrc:

# Change the umask automatically for some directories; use 0022 as the default
chpwd () {
    case $PWD in
        $HOME/[Dd]ocuments*)
            if [[ $(umask) -ne 077 ]]; then
                umask 0077
                echo -e "\033[01;32mumask: private \033[m"
            fi;;
        */[Ww]eb*)
            if [[ $(umask) -ne 072 ]]; then
                umask 0072
                echo -e "\033[01;33mumask: other readable \033[m"
            fi;;
        /vol/nothing)
            if [[ $(umask) -ne 002 ]]; then
                umask 0002
                echo -e "\033[01;35mumask: group writable \033[m"
            fi;;
        *)
            if [[ $(umask) -ne 022 ]]; then
                umask 0022
                echo -e "\033[01;31mumask: world readable \033[m"
            fi;;
    esac
}

Für den interaktiven Gebrauch würde so etwas funktionieren (aber natürlich nicht, um Sicherheit zu bieten).

Ville
quelle