Calculando valores UMASK

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.

[ Hits: 104.543 ]

Por: eddie hsu em 09/08/2007


Regra geral e de exceção



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.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Regra geral e de exceção
   3. Conclusão
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Gerenciamento de pacotes RPM (parte 1)

CRON e CRONTAB: um pouco de teoria, uso e exemplos

Erro no KDM (temas) depois de update no Sabayon

Permissão de Execução de Arquivo (Script ou Binário) no GNU/Linux - Elementos Básicos para Compreensão

Configurando o X.org

  
Comentários
[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ó!

Grande abraço.

[3] Comentário enviado por slaypher em 09/08/2007 - 17:11h

elgio,

Como seria essa regra? Teria como postar pra gente?

[]'s

[4] Comentário enviado por elgio em 09/08/2007 - 17:48h

Oi Carlos.

A regra é esta que pus no meu primeiro comentário, talvez não tenha sido suficientemente explícito e didático

As permissões são em OCTAL:
6 = 110
7 = 111

Logo, em BINARIO, 666 = 110 110 110

O Umask nada mais é do que um AND bit a bit com a máscara invertida!

BASE: 666 para arquivos
UMASK: 007
UMASK em binário: 000 000 111
UMASK Invertido : 111 111 000

Então se faz um AND bit a bit do 666 com o UMASK invertido

666 = 110 110 110
UMASK = 111 111 000
AND = 110 110 000

Permissoes que ficaram = 110 110 000 = 660

Esta é a ÚNICA forma, sem excessão, mas envolve matemática binária.

[5] Comentário enviado por scoob em 09/08/2007 - 21:25h

Olá, amigos....Elgio, desculpe a intromissão, mas isto que você fez não me parece uma operação OR bit a bit, mas sim um AND bit a bit...concorda?

Vamos relembrar as operações...e me corrijam se eu estiver errado...

666 = 110 110 110
UM = 111 111 000

OR = 111 111 110
AND= 110 110 000
XOR= 001 001 110

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

;>))

Abraços!!!

[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

[7] Comentário enviado por thelinux em 09/08/2007 - 23:31h

xibatapb

O seu artigo é ÚTIL, perfeito, claro e objetivo. Parabéns!

[8] Comentário enviado por scoob em 10/08/2007 - 07:47h

Seu artigo está excelente!!!

Obrigado por colaborar!!

;>))

Abraços

[9] Comentário enviado por elgio em 10/08/2007 - 09:55h

Caro Scoob Junior.

Obrigado pela sua correção.
Tomei a liberdade de EDITAR meus comentários já corrigindo, mas registro aqui que eu errei.

É um AND e Não OR.
Eu disse OR mas fiz AND. Logo estão certos meus exemplos, mas está errado quando digo OR. A operação matemática é esta:

(Permissão BASE) AND (Not umask)
[]'s

[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.

Abraços.

[11] Comentário enviado por xibatapb em 11/08/2007 - 00:39h

Está corretíssimo.
Obrigado mais uma vez pela contribuição, caro elgio.

Abraços

[12] Comentário enviado por capitainkurn em 11/08/2007 - 21:44h

Excelente artigo! Muito útil, já está em meus favoritos.

[13] Comentário enviado por slaypher em 13/08/2007 - 16:24h

Muito bom,

Com isso não me restam mais dúvidas sobre essas operações, parabéns ao dono do artigo e aos que comentaram, completando o mesmo.

[]'s

[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 :)

Parabéns pelo artigo!! Muito legal mesmo.

[]'s

[15] Comentário enviado por Rafaelmcosta em 29/01/2008 - 06:36h

gostei bastante da sua fórmula...bem útil...assim como o q o elgio postou

abracos e sucesso

[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.

[17] Comentário enviado por ronaldobarboza em 09/02/2013 - 11:36h

Vlw Cara, muito bom esse arquivo

[18] Comentário enviado por fernandorego em 21/06/2014 - 15:09h

Gostei! Não é tão certinha como reclamam os colegas, mas pra quem quer praticidade E CONHECE as regras de permissões, é uma excelente dica!

[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.


0666 - 0646 = 0020


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts