Como definir umask para uma pasta específica

23

Por algumas razões óbvias, preciso definir o umaskvalor para uma pasta específica. Como alguém pode fazer isso?

Obrigado antecipadamente!

ATUALIZAÇÃO 1

O motivo pelo qual preciso usar umask para uma pasta específica é o seguinte. Eu tenho um aplicativo Web e, quando ele cria algum arquivo, a permissão padrão é 700. Mas eu preciso de pelo menos 755 permissões para esse arquivo. Acho que poderia explicar o problema mais claramente agora.

Bakhtiyor
fonte
1
As razões podem ser óbvias para você, mas não para nós. Compartilhe o que você quer fazer.
Htorque 22/05
@htorque. Adicionado o motivo pelo qual preciso usar umask no meu problema específico.
Bakhtiyor

Respostas:

30

você poderia usar setfacl

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

Onde nameestá o nome do grupo

Para descobrir em quais grupos você ou um usuário específico pertence, consulte No unix / linux, como você descobre em qual grupo um determinado usuário está via linha de comando?

yogi70
fonte
1
Talvez setfacltenha mudado. Estou recebendo um erro informando que -mnão é uma opção válida.
Ryan Burnette
Ryan, setfaclnão mudou. Provavelmente você não forneceu o nome do grupo adequado (depois -m).
sergk
1
com certeza setfaclé para listas de controle de acesso e não umask. Uma solução melhor, mas não realmente o que foi solicitado, eu não acho.
Wyatt8740
tente: sudo setfacl -Rdm ...(Omita o R para recursão) deve funcionar. @ Wyatt8740 (correto). Para ter certeza, execute:, man setfacle digite /-modify. Você precisa usar sudo.
JREAM 27/02
11

Você não pode definir umask por diretório, é um valor no nível do processo. Se você precisar impedir que outras pessoas leiam arquivos em um diretório, revogue os bits de permissão correspondentes.

Por exemplo, se você tiver um diretório /home/user/directorycom alguns arquivos e diretórios que podem obter permissões como 777 de um processo, defina os bits de permissão /home/user/directorypara algo como 700. Isso tornará impossível a descida de outros usuários (excluindo a raiz do superusuário) no /home/user/directory.

Sou paranóico e defino as permissões /home/userpara 750, para que apenas eu possa ler, escrever e descer no meu diretório pessoal. Isso tem como conseqüência que pastas como /home/user/Publicnão podem ser acessadas por outras pessoas, mas eu posso viver com isso.


Por atualização da sua pergunta: ainda assim, você não pode controlar isso no sistema de arquivos (exceto usando um tipo de sistema de arquivos diferente como o FAT, que é fortemente desaconselhável), é necessário fazer isso no seu aplicativo da web. Se o seu aplicativo da web estiver codificado em PHP, você poderá alterar o umask on the fly usando a umaskfunção:

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

Você pode colocar isso em um arquivo de configuração, como o arquivo que contém a senha de conexão com o banco de dados (pensando em aplicativos como o Wordpress).

Lembre-se de que é um valor do processo, alguns servidores da Web permitem que você o defina em seus arquivos de configuração; caso contrário, você pode modificar os scripts de inicialização para definir o umask desejado. Lembre-se de que permissões são 755e 644são bastante perigosas para aplicativos da web; se o código for sensível, todos poderão lê-lo.

Lekensteyn
fonte
Eu sei que isso é antigo, mas acho que vale a pena mencionar: o administrador pode ligar o mount /home/user/Public( mount -o bind /home/user/Public /some/other/place) para solucionar o problema de permissões do diretório pai.
Adrian Günter
1

Para alterar as permissões de uma pasta, use chmod. umask é para arquivos.

Defina umask para o que você precisa

umask xxx

e volte quando terminar

umask 022
wojox
fonte
11
umask = arquivos e diretórios, fmask = somente arquivos, dmask = somente diretórios. : P
htorque
1
Eu aprendi algo novo hoje :)
wojox
1
Na verdade, são opções para determinados sistemas de arquivos como NTFS (não esse comando de configuração da máscara de criação de arquivos umask). Desculpe por adicionar informações confusas.
Htorque 22/05
umask altera a máscara de criação de arquivo para o processo atual (o shell atual); se você tiver um processo diferente de shell aberto ou de propriedade do usuário, não acredito que seja afetado. Este comando também afetará quaisquer outros arquivos criados fora do diretório até você alterá-lo novamente.
Dave
1

Outra solução pode ser apenas definir o ID do grupo nos arquivos criados no diretório, o que torna os novos arquivos pertencentes ao ID do grupo de diretórios, em vez do ID do grupo do usuário que criou os arquivos. Então eu acho que você poderia fazer:

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

chmod 4755 /my/folder

Isso define a permissão de arquivo especial setgid, que faria com que todos os arquivos criados /my/folderpertencessem ao www-datagrupo, que possui permissão rx (5) por causa do diretório pai.

Bastiaan
fonte
2
Você tem confundido o GUID para o valor SUID octal
adampski
1

Fornecer outra solução implementada com ganchos e direnv. A solução a seguir pode ser mais compatível caso setfaclnão esteja disponível no seu sistema. (por exemplo, macOS)

direnvé um alternador de ambiente para o shell. Ele sabe como conectar-se ao bash, zsh, tcsh, fish shell e elvish para carregar ou descarregar variáveis ​​de ambiente, dependendo do diretório atual .

Use .envrccomo valor exportpersonalizado umaskpara dir específico, e o exported env var será descarregado quando você deixar esse dir.

# example .envrc file
export UMASK=0022

Defina um gancho para alterar o umaskvalor depois que o diretório de trabalho for alterado.

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"

Por enquanto, a inicialização do direnv hook para zsh não suporta chpwdhook. Se a solicitação de recebimento GH-514 não tiver sido mesclada quando você vir esta página. Por favor, comente eval "$(direnv hook zsh)"e gancho direnvem chpwdmanualmente com seguinte código,

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

Simba
fonte
0

Relacionado, mas talvez não aplicável, neste caso, o seguinte clipe é de .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
}

Portanto, para uso interativo, algo assim funcionaria (mas, obviamente, não para fornecer segurança).

Ville
fonte