Este artigo busca, com 2 regras simples, fazer os usuários de distribuições Linux, estudantes de concursos, exames LPI e etc a entenderem como calcular os valores UMASK de forma objetiva.
1. REGRA GERAL para calcular umask de ARQUIVOS e DIRETÓRIOS:
Subtraia: 7 - valor_da_umask
Exemplo: Temos uma umask de valor 333 e queremos saber como ficarão as permissões de arquivos e diretórios.
Calculemos então:
777 - 333 = 444
As permissões de arquivos e diretórios serão igual 444, ou seja, r--r--r--.
Atenção: a regra a seguir é fundamental para o entendimento completo da questão do "cálculo" umask... veja abaixo.
2. REGRA DE EXCEÇÃO: quando os números da umask forem (0, 2, 4 ou 6), o método de cálculo para a permissão dos ARQUIVOS muda (diretórios PERMANECEM seguindo a regra geral), ficando assim:
Subtraia: 6 - valor_da_umask
Exemplo: tomando a famosa umask default como base 022;
Para ARQUIVOS a permissão será calculada assim:
666 - 022 = 644
As permissões de arquivos serão igual a 644 ou seja, rw-r--r--;
Para DIRETÓRIOS, continuamos seguindo a regra geral, então o cálculo fica:
777 - 022 = 755
As permissões de diretórios serão igual a 755, ou seja, rwxr-xr-x.
OBS: Perceba que DIRETÓRIOS SEMPRE usam a REGRA GERAL
3. Mais um exemplo pra fixar a idéia
# umask 324
Teremos que aplicar ambas as regras neste caso, pois temos o 3 que segue a regra geral tanto para arquivos como para diretórios e temos o 2 e o 4 que seguirão a regra de exceção no caso das permissões para arquivos.
Vamos primeiro calcular como ficarão as permissões para ARQUIVOS:
7 - 3 = 4 (segue regra geral porque o valor é 3)
6 - 2 = 4 (segue a regra de exceção porque o valor 2 faz parte da regra de exceção)
6 - 4 = 2 (segue a regra de exceção porque o valor 4 faz parte da regra de exceção)
Resultado: para arquivos a permissão ficará igual a 442, ou seja, r--r---w-.
Agora calculemos as permissões para DIRETÓRIOS (que segue sempre a regra geral):
7 - 3 = 4
7 - 2 = 5
7 - 4 = 3
Resultado: para diretórios a permissão ficará igual a 453, ou seja, r--r-x-wx.
[1] Comentário enviado por elgio em 09/08/2007 - 14:07h
Interessante este ATALHO para calcular as permissões, mas ela é PERIGOSA. Acaba tendo muitas excessões que não sei realmente se vale a pena!
Exemplo: quais as permissões de um arquivo criado se o umask for 007?
E um diretório?
Segundo esta tua dica: 777 - 007 = 770 o que não é verdade
Ou de outro lado: 666 - 007 = 66(-1) ???
Na verdade com este umask os diretorios serão criados com 770 e os arquivos com 660.
O VERDADEIRO cálculo de umask envolve operações binárias, no caso um Not e um AND sobre as permissões BASE.
Permissão BASE ARQUIVO: 666 TODAS as permissões, exceto de execução.
Permissão BASE DIRETORIO: 777 TODAS as permissões, inclusive execução, pois EXECUTAR um diretório significa poder entrar nele.
Umask 007
Arquivo : 666 AND (not 007) tudo em OCTAL
not 007 = 000 000 111 => 111 111 000
666 110 110 110
AND 111 111 000 (not 007)
RES 110 110 000 (660)
Arquivo tera 660 de permissao.
Diretorio: 777 AND (not 007) em OCTAL
111 111 111 (777)
111 111 000 (not 007)
111 111 000 (770)
Diretorio sera criado com 770
Bom, sei lá. Eu prefiro assim, regra geral sem excessões que funciona sempre e pra tudo. Só que tem que saber a linguagem binária!
[2] Comentário enviado por elgio em 09/08/2007 - 14:32h
Ah, para complementar.
Muito legal a iniciativa de se buscar formas matemáticas alternativas e mais fáceis para calcular o umask.
Mas sei lá!
Acaba tendo várias regras para arquivos que são assim ou não!
Veja bem: regra geral + excessão para 0,2,4 e 6 + Alguma outra para arqs binários e mesmo assim tem problema (nenhuma regra convergiu certo para máscara 007 sobre arquivos).
Será que não é melhor aprender a GRANDE regra matemática que funciona para todos os casos? É mais hacker, mas é uma vez só!
Para o pessoal que não tem muita prática com os números binários, é fácil...
1 - Compare os bits que estão nas colunas correspondentes
2 - Operação OR: o bit resultante será 1 se um dos dois bits de comparação for 1
3 - Operação AND: o bit resultante será 1 se ambos os bits de comparação forem 1
4 - XOR: o bit resultante será 1 se e somente se um dos bits de comparação for 1 e o outro for 0
5 - NOT: basta inverter 0 por 1 e 1 por 0
[6] Comentário enviado por xibatapb em 09/08/2007 - 23:02h
Caros amigos!
Muito obrigado pelos comentarios, vejo que tudo isso me fez perceber que eu talvez nao tenha sido tao claro!
As 2 regras sao perfeitas e servem para qualquer caso. Mas, temos que entender bem! Por favor leiam com atencao. Eu achei uma forma simples e pratica pra quem precisa fazer isso com rapidez nas provas, ok? Logico que saber a BASE de tudo eh muito mais interessante... Mas depois q se entende as 2 regras vc calcula isso extremamente rapido... mas deixemos de conversa e vamos lah demonstrar o exemplo que elgio citou no primeiro post.
Como Elgio sugeriu, usemos uma umask de valor 007
Comecemos pelos diretorios:
diretorios sempre irao usar a regra geral, ou seja, o numero 7 subtrai tanto os numero impares e pares e zero do valor umask.
portanto:
777 - 007 = 770, ou seja permissao 770 para diretorios (resultado igual ao do elgio)
Agora vamos ver como as permissoes vao ficar para os arquivos...
Lembremos que em permissoes de arquivos os numeros IMPARES seguem a regra GERAL, e os numeros PARES (2, 4 e 6) e ZERO seguem a regra de EXCECAO.
Assim vamos ao resultado:
Umask 007
6 - 0 = 6 (usamos 6 pq zero pertence a regra de excecao)
6 - 0 = 6 (usamos 6 pq zero pertence a regra de excecao)
7 - 7 = 0 (usamos 7 pq numeros impares continuam seguindo a regra geral)
resumindo: 667 - 007 = 660
Arquivos entao ficarao com permissao igual a 660 ! (igual ao resultado de elgio)
Concluindo, basta ler com atencao e perceber atraves desse exemplo que se prestarmos atencao nas regras e entendermos bem, poderemos calcular rapidamente tudo, sem precisar ter conhecimentos de numeros binarios.
Pessoal, muito obrigado. E espero que eu tenha esclarecido as duvidas!
Confiram o ultimo exemplo do artigo, ele retrata bem o uso das duas regras.
Abracos e obrigado pelos comentarios (elgio, scoob, carlos e cia)
ps: Prometo q melhorarei a didatica nos proximos artigos
[10] Comentário enviado por elgio em 10/08/2007 - 14:37h
xibatapb:
realmente, li rápido e não captei o macete.
Com a sua explicação, ficou mais claro como é o atalho para calcular.
Em tempo: arquivos binários seguem o mesmo padrão para os diretórios, com permissão base 777 (TUDO, inclusive executar).
Mas veja que a única forma de eu criar um arquivo binário é se o fizer compilando um fonte com GCC. Ele, o compilador, vai deixar as permissões seguindo minha UMASK.
Se for um shell script, o arquivo é texto puro, só sendo executável quando eu der a permissão explicitamente com chmod.
[14] Comentário enviado por edirlf em 13/08/2007 - 19:22h
Que massa. Eu que não sabia nada sobre umask vou estudar das duas formas, uma pra aprender da forma que achei que fica mais correto e desta forma, que por sinal me vai ser muito útil nos próximos concursos, tomara. ehhehe :)
[16] Comentário enviado por removido em 07/06/2011 - 11:22h
Ainda acho isso falho, vamos a seguinte situação. A questão dá as permissões de um arquivo depois de aplicado o UMASK e pergunta qual é esse UMASK que gerou aquelas permissões para aquele arquivo.
Ex: Qual a umask utilizada para definir permissões para novos arquivos no padrão -rw-r--rw- ?
A) 0121 B) 0021 C) 0646 D) 1131 E) 0224
-rw-r--rw- = 000 110 100 110 = 0646
Vamos fazer segundo seu método:
0 -> 7-7 ou 6-6 ????
6 -> 7-1 ou 6-0 ???
4 -> 7-3 ou 6-2 ????
6 -> 7-1 ou 6-0 ???
E aí como fica isso? Não sei se consegui explicar a a falha pra resolver questões assim.
Por isso acho o método do AND NOT melhor que resolve qualquer questão.
[19] Comentário enviado por millinux em 07/04/2015 - 23:29h
Excelente post, simples conta de matematica, ex: para diretorio 7 - 4 = 4, terei diretorio com permissão de leitura, retirando o a permissão que não quero, para sub pastas, retiro pelo valor 6, ex: 6 - 2 = 4, permissão de leitura, é como se foses chmod go-wx, muito bom.
[20] Comentário enviado por tucamenezes em 14/01/2016 - 16:57h
[16] Comentário enviado por sergioric em 07/06/2011 - 11:22h
Ainda acho isso falho, vamos a seguinte situação. A questão dá as permissões de um arquivo depois de aplicado o UMASK e pergunta qual é esse UMASK que gerou aquelas permissões para aquele arquivo.
Ex: Qual a umask utilizada para definir permissões para novos arquivos no padrão -rw-r--rw- ?
A) 0121 B) 0021 C) 0646 D) 1131 E) 0224
-rw-r--rw- = 000 110 100 110 = 0646
Vamos fazer segundo seu método:
0 -> 7-7 ou 6-6 ????
6 -> 7-1 ou 6-0 ???
4 -> 7-3 ou 6-2 ????
6 -> 7-1 ou 6-0 ???
E aí como fica isso? Não sei se consegui explicar a a falha pra resolver questões assim.
Por isso acho o método do AND NOT melhor que resolve qualquer questão.
[21] Comentário enviado por gingercat em 20/10/2023 - 13:56h
Olá! Ótimo artigo.
Essa regra de (6 - permissão desejada) para usmak de arquivos só servem para arquivos tipo texto, porque arquivos binários funcionam de forma diferente?
Queria saber qual calculo usar para arquivos binário.