Come impostare umask per una cartella specifica


23

Per alcuni ovvi motivi devo impostare il umaskvalore per una cartella specifica. Come si fa?

Grazie in anticipo!

AGGIORNAMENTO 1

La ragione per cui devo usare umask per una cartella specifica è la seguente. Ho un'applicazione web e quando crea un file l'autorizzazione predefinita è 700. Ma ho bisogno di almeno 755 autorizzazioni per quel file. Penso di poter spiegare il problema più chiaramente ora.


1
Le ragioni potrebbero essere ovvie per te, ma non per noi. Si prega di condividere ciò che si desidera fare.
Htorque,

@htorque. Aggiunto il motivo per cui ho bisogno di usare umask nel mio problema specifico.
Bakhtiyor,

Risposte:


30

potresti usare setfacl

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

Dov'è nameil nome del gruppo

Per scoprire a quali gruppi appartenete tu o un utente specifico, vedere in unix / linux come si fa a sapere in quale gruppo appartiene un determinato utente dalla riga di comando?


1
Forse setfaclè cambiato. Ricevo un errore che indica che -mnon è un'opzione valida.
Ryan Burnette,

Ryan, setfaclnon è cambiato. Molto probabilmente non hai fornito il nome del gruppo corretto (dopo -m).
sergk,

1
abbastanza sicuro setfaclè per le liste di controllo degli accessi e non umask. Una soluzione migliore ma in realtà non è stato chiesto, non credo.
Wyatt8740,

prova: sudo setfacl -Rdm ...(Ometti la R per ricorsione) dovrebbe funzionare. @ Wyatt8740 (corretto). Per essere sicuri, esegui: man setfacle digita /-modify. È necessario utilizzare sudo.
JREAM,

11

Non puoi impostare umask per directory, è un valore a livello di processo. Se è necessario impedire ad altri di leggere i file in una directory, revocare i bit delle autorizzazioni corrispondenti.

Ad esempio, se hai una directory /home/user/directorycon alcuni file e directory che possono ottenere autorizzazioni come 777 da un processo, imposta i bit di autorizzazione su /home/user/directoryqualcosa come 700. Ciò renderà impossibile per gli altri utenti (escluso il superutente root) scendere in /home/user/directory.

Sono paranoico e imposto le autorizzazioni su /home/user750, quindi solo io posso leggere, scrivere e scendere nella mia directory home. Ciò ha come conseguenza che cartelle simili /home/user/Publicnon sono accessibili ad altri, ma posso conviverci.


Per ogni aggiornamento della tua domanda: tuttavia, non puoi controllarlo nel filesystem (oltre all'utilizzo di un diverso tipo di filesystem come FAT che è fortemente scartato), devi farlo nella tua webapp. Se la tua webapp è codificata in PHP, puoi cambiare l'umask al volo usando la umaskfunzione:

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

Potresti metterlo in un file di configurazione, come il file contenente la password di connessione al database (pensando in app come Wordpress).

Ricorda che è un valore di processo, alcuni server web ti permettono di impostarlo nei loro file di configurazione, altrimenti potresti modificare gli script di avvio per impostare l'umask desiderato. Ricorda che le autorizzazioni piacciono 755e 644sono piuttosto pericolose per le webapp, se il codice è sensibile, tutti possono leggerlo.


So che questo è antico, ma immagino che valga la pena menzionare: l'amministratore può associare mount /home/user/Public( mount -o bind /home/user/Public /some/other/place) per aggirare il problema delle autorizzazioni della directory principale.
Adrian Günter

1

Per modificare le autorizzazioni per una cartella, utilizzare chmod. umask è per i file.

Imposta umask su quello che ti serve

umask xxx

e tornare indietro quando hai finito

umask 022

11
umask = file e directory, fmask = solo file, dmask = solo directory. : P
htorque,

1
Ho imparato qualcosa di nuovo oggi :)
Wojox

1
In realtà sono opzioni per alcuni file system come NTFS (non quel comando di impostazione della maschera per la creazione di file umask). Ci scusiamo per l'aggiunta di informazioni confuse.
Htorque,

umask cambia la maschera di creazione del file per il processo corrente (la shell corrente), se hai una shell aperta o un processo di proprietà dell'utente diverso, non credo che ne risentirà. Questo comando influenzerà anche tutti gli altri file creati al di fuori della directory fino a quando non lo cambi.
Dave,

1

Un'altra soluzione potrebbe essere quella di impostare l'ID del gruppo sui file creati nella directory, il che rende i nuovi file di proprietà dell'ID del gruppo di directory, anziché l'id del gruppo dell'utente che ha creato i file. Quindi penso che potresti semplicemente fare:

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

chmod 4755 /my/folder

Questo imposta l'autorizzazione del file speciale setgid, che farebbe sì che tutti i file creati /my/folderfossero di proprietà del www-datagruppo, che ha quindi l'autorizzazione rx (5) a causa della directory padre.


2
Hai scambiato il GUID per il valore ottale SUID
adampski il

1

Fornire un'altra soluzione implementata con ganci a guscio e direnv. La seguente soluzione potrebbe essere più compatibile nel caso in cui setfaclnon sia disponibile sul tuo sistema. (ad es. macOS)

direnvè un selettore di ambiente per la shell. Sa come agganciarsi a bash, zsh, tcsh, fish shell ed elfish per caricare o scaricare variabili d'ambiente a seconda della directory corrente .

Utilizzare .envrcper exportun umaskvalore personalizzato per una directory specifica e la exportvariabile en env verrà scaricata quando si esce da quella directory.

# example .envrc file
export UMASK=0022

Definire un hook per modificare il umaskvalore dopo aver modificato la directory di lavoro.

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"

Per il momento, l'inizializzazione del hook di direnv per zsh non supporta il chpwdhook. Se la richiesta pull GH-514 non è stata unita quando vedi questa pagina. Si prega di commentare eval "$(direnv hook zsh)"e gancio direnvsulla chpwdmanualmente con codice seguente,

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

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


0

Correlato, ma forse non applicabile in questo caso, la seguente clip proviene da .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
}

Quindi, per un uso interattivo, qualcosa del genere funzionerebbe (ma, ovviamente, non per fornire sicurezza).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.