Calculo de umask definitivo.

-->
Estava eu aprendendo a calcular umask e vi uma séria de informações desencontradas, alguns dizendo por exemplo para diminuir de 777, 666 e assim vai. Mas nada funcionava efetivamente dependendo do umask que você quer aplicar. Foi então que lendo a wiki do Archwiki e vendo uma afirmação me veio uma maneira simples de fazer o calculo:

  • Linux does not allow a file to be created with execution permissions, in fact the default creation permissions are 777 for directories, but only 666 for files.
  • On Linux, only the file permission bits of the mask are used, i.e. the 022 mask is equivalent to 0022.[1]


Antes de ler isso na wiki eu estava fazendo a relação abaixo que vi em alguns sites:

0 - 7 - rwx
1 - 6 - rw
2 - 5 - r-x
3 - 4 - r--
4 - 3 - -wx
5 - 2 - -w-
6 - 1 - --x
7 - 0 - ---

Que mostra a relação entre o valor de umask e o valor octal normal de permissão (rwx).
Vamos ao exemplo, se o umask é 007, qual será o valor final para diretórios e arquivos?
Relembre da afirmação tirada da wiki do Arch, o máximo que se pode chegar em permissão para diretórios no linux usando umask é 777 já para arquivos é 666, isso faz sentido porque por padrão o linux não dá permissão de execução para arquivos, agora vem a mágica de como calcular.
Dado o umask 007 a permissão para o diretório será:
777 - 007 = 770
Já para novos arquivos a nova permissão será:
660.

Veja abaixo:

dd:teste3 tux$ umask 007
dd:teste3 tux $ touch umaskfile007
dd:teste3 tux $ mkdir umaskdir007
dd:teste3 tux $ ls -ltra
-rw-rw----   1 edipo  wheel    0 16 Set 09:44 umaskfile007
drwxrwx---   2 edipo  wheel   68 16 Set 09:44 umaskdir007

Como cheguei no 660? Simples, eu so removi o valor que da execução no arquivo, lembra que o máximo que se pode chegar em permissão para arquivo é 666 e não 777 como diretórios? Ai está o segredo, sempre que quiser saber qual permissão os arquivos vão ter para um dado umask, faça o calculo para diretório, que é bem simples e para arquivo simplesmente remova a permissão de execução. Faça o teste, isso vale para qualquer valor de umask.
Vamos a outro exemplo para mostrar que funciona.
umask 135, para diretório temos:

777 - 135 = 642 -> rw-r---w-

Perceba que acima não temos nenhuma permissão de execução, logo a permissão dos arquivos será a mesma dos diretórios:

dd:teste3 edipo$ umask 135
dd:teste3 edipo$ touch umask135file
dd:teste3 edipo$ mkdir umask135dir
dd:teste3 edipo$ ls -ltra
-rw-r---w-   1 edipo  wheel    0 16 Set 09:50 umask135file
drw-r---w-   2 edipo  wheel   68 16 Set 09:50 umask135dir

Vamos testar agora com algum outro umask que dê execução para os diretórios, 242

777 - 242 = 535 -> r-x-wx-r-x
Para arquivo teremos:
r--w--r-- = 424
Repare que apenas removi a permissão de execução para chegar ao novo valor para arquivos:

dd:teste3 edipo$ umask 242
dd:teste3 edipo$ touch umask242file
dd:teste3 edipo$ mkdir umask242dir

dd:teste3 edipo$ ls -ltra
-r---w-r--   1 edipo  wheel    0 16 Set 09:54 umask242file
dr-x-wxr-x   2 edipo  wheel   68 16 Set 09:54 umask242dir


Espero muito ter ajudado, eu busquei uma maneira fácil de fazer isso porque na hora de fazer uma prova, como a LPI por exemplo, é bem mais simples de fazer de cabeça do que ficar fazendo calculo com bits.

UPDATE

Enquanto estava fazendo um exercício notei que para calcular o inverso você deve fazer assim.
Você quer as permissões dos arquivos criados como rw-r----- (640) por padrão.
Para saber o qual umask utilizar é simples, primeiro, seguindo a lógica do post, sempre calcule como seria a permissão para o diretório que contem os arquivos, aqui vem o segredo, adicione a permissão de execução somente para os grupos que já possuem permissão de leitura ou escrita, nesse caso temos:
arquivo - rw-r-----
pasta - rwxr-x---
Sendo assim a permissão da pasta que contem o arquivo com o umask setado seria 750, então temos:
777 - 750 = 027
Está ai o valor do umask que você tem que utilizar.

Pode parecer complicado no início mas praticando vai ver que é bem mais fácil calcular do que usando bits.











Comentários

Postagens mais visitadas deste blog

Transformando o Linksys WRT54G2 V1 em bridge, repetidor

Recuperando partições deletadas

How to install YUM and other rpm packages on VIOs and AIX manually