Linux / Comando umask: definir permissões de novos arquivos

umask define quais bits de permissão serão retirados quando o processo criar novos arquivos ou diretórios. No shell, a configuração é herdada pelos processos filhos; ela não muda as permissões de arquivos já existentes. Com pedidos usuais de criação e sem uma lista de controle de acesso (ACL) padrão no diretório pai, a máscara 022 costuma resultar em arquivos 644 e diretórios 755.

Sintaxe e implementação

umask [-p] [-S] [máscara]

No Bash, umask é um comando interno. Consulte help umask no próprio shell para confirmar as opções disponíveis; outros shells podem oferecer formatos diferentes. A máscara numérica é interpretada em base oito: use apenas dígitos de 0 a 7. Os colchetes da sintaxe indicam argumentos opcionais, não caracteres a digitar.

Consultar a máscara atual

Sem argumento, o comando mostra o valor atual em formato octal:

umask

Por exemplo, 0022 representa a máscara 022. Esse número descreve os bits a retirar, não o modo de um arquivo existente. Para ver a forma simbólica:

umask -S

Com a máscara 027, o Bash mostra u=rwx,g=rx,o=. Nessa exibição, as letras indicam as permissões permitidas pela máscara para o proprietário (u), o grupo (g) e os demais usuários (o). Isso não garante execução em novos arquivos: o programa criador também precisa solicitar esse bit.

Alterar e restaurar a configuração do shell

Antes de experimentar no shell atual, guarde o valor com umask_anterior=$(umask). O exemplo a seguir altera a máscara e a consulta novamente:

umask 027
umask

No Bash, a consulta deve mostrar 0027. A configuração passa a valer para criações posteriores desse shell e de seus processos filhos. Ela não muda o shell que o iniciou nem processos que já estavam em execução. Para repor o valor salvo, execute umask "$umask_anterior" no mesmo shell; não escolha 022 como restauração sem conhecer o valor anterior.

Em vez de alterar o shell interativo, o exercício seguinte usa parênteses para criar um subshell. A máscara e a mudança de diretório ficam nesse contexto e terminam com ele. Salvar um número não faz uma restauração automática: no primeiro exemplo, é preciso executar a reposição explicitamente.

Criar arquivo e diretório numa pasta nova

Use Bash e ferramentas GNU num diretório gravável. O bloco cria uma subpasta exclusiva com mktemp e só avança quando a etapa anterior termina com sucesso, por causa dos &&. Assim, demo.txt e demo-dir ainda não existem no local de prática:

(
  umask_lab=$(mktemp -d ./umask-demo.XXXXXX) &&
  cd -- "$umask_lab" &&
  umask 027 &&
  umask &&
  touch demo.txt &&
  mkdir demo-dir &&
  stat -c '%a %n' demo.txt demo-dir
)

Saída esperada num sistema Linux em que touch peça 0666, mkdir peça 0777 e o diretório pai não tenha uma ACL padrão:

0027
640 demo.txt
750 demo-dir

O modo 640 permite leitura e escrita ao proprietário, leitura ao grupo e nenhum desses bits aos demais usuários. No diretório 750, o proprietário recebe leitura, escrita e busca; o grupo recebe leitura e busca; os demais não recebem esses bits. O x de um diretório permite busca ou travessia, não significa executar seu conteúdo como um programa.

Confira o diagnóstico se uma etapa falhar. Um nome já existente pode fazer mkdir falhar; touch sobre um arquivo existente apenas atualiza seus horários e não recalcula seu modo pela máscara. O exemplo deixa os itens na subpasta de prática e não altera arquivos de outras pastas.

Na verificação com Bash 5.3.9 e GNU stat 8.32 do Git para Windows, o bloco mostrou 0027, 640 e 750. Consultas em outros contextos de shell apresentaram modos diferentes. Esses resultados não verificam a imposição de permissões entre contas num Linux; confira o modo, a ACL e o acesso no sistema de arquivos Linux onde fará a tarefa.

Entender a retirada de bits

Sem ACL padrão no diretório pai, a regra é aplicar ao modo solicitado os bits que a máscara deixa passar: modo solicitado & ~máscara, considerando os bits de permissão. Para 0666 e 0027, o resultado é 0640; para 0777 e 0027, é 0750. Não faça uma subtração aritmética comum: 0666 menos 0027 em octal daria 0637, que não é o resultado dessa operação de bits.

Um programa pode pedir 0600 desde o início; a máscara 022 não acrescenta leitura ao grupo nem aos demais usuários. Da mesma forma, uma máscara 000 não dá automaticamente execução a um arquivo cujo pedido foi 0666. O resultado depende do pedido de criação e pode ainda ser alterado posteriormente pelo próprio programa.

Uma lista de controle de acesso, ou ACL, padrão no diretório pai muda a regra no Linux: a ACL padrão é herdada, a umask é ignorada nesse cálculo e os bits ausentes do modo solicitado são retirados. O manual Linux de umask(2) descreve essa exceção. Não atribua automaticamente uma diferença de modo a um erro da máscara; examine também a ACL e o sistema de arquivos.

Máscaras e opções comuns

Formato Significado
022 Retira escrita do grupo e dos demais; com pedidos 0666 e 0777, os modos usuais são 0644 e 0755.
027 Retira escrita do grupo e todos os bits dos demais; nas mesmas condições, resulta em 0640 e 0750.
077 Retira todos os bits do grupo e dos demais; nas mesmas condições, resulta em 0600 e 0700.
-S Sem nova máscara, mostra a forma simbólica das permissões permitidas pela máscara.
-p No Bash, sem nova máscara, imprime uma forma reutilizável como comando, por exemplo umask 0027.

Os resultados numéricos da tabela pressupõem a regra sem ACL padrão mencionada acima. Escolha a máscara conforme a necessidade de compartilhamento; 077 restringe os bits do grupo, portanto não serve automaticamente a uma pasta em que colegas precisam ler ou escrever novos arquivos.

Escopo, persistência e arquivos existentes

Um filho herda a máscara do pai, mas pode substituí-la. Executar umask num Bash separado não reconfigura o shell pai. Uma alteração interativa também não é, por si só, uma configuração permanente para logins futuros, serviços ou contêineres. Identifique o processo que cria o arquivo e a configuração de inicialização desse contexto antes de mudar políticas.

Para ajustar os bits de um arquivo existente, use o comando chmod. A máscara também não escolhe o proprietário nem o grupo do novo item. Quando o objetivo é acesso compartilhado, confira o grupo e os bits, como explicado no guia de chgrp, além da travessia dos diretórios do caminho e das demais políticas aplicáveis.

No Bash, uma máscara inválida produz diagnóstico e status diferente de zero. Consulte echo "$?" imediatamente após a operação para verificar seu status, e depois use umask para conferir o valor. Um status de sucesso do comando não substitui a consulta do modo e do acesso efetivo ao arquivo criado.

Pergunta frequente

Umask 022 transforma os arquivos existentes em 644?

Não. A máscara participa da criação de novos itens no contexto do processo; ela não modifica os arquivos existentes. Mesmo para um novo arquivo, 644 depende do modo solicitado e da ausência de condições como uma ACL padrão que determine outro cálculo.

Documentação

Consulte a seção de comandos internos do Bash, incluindo umask para a sintaxe, as formas numérica e simbólica e as opções do shell.