Calculo de umask definitivo.
Autor: Edipo G | Publicado: 2015-09-16T09:57:00-03:00


<!--
google_ad_client = "ca-pub-3021803715878426";
/* lordpinguimPost */
google_ad_slot = "9468077813";
google_ad_width = 300;
google_ad_height = 250;
//

--&gt;



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&nbsp;tux&nbsp;$ touch umaskfile007
dd:teste3&nbsp;tux&nbsp;$ mkdir umaskdir007
dd:teste3&nbsp;tux&nbsp;$ ls -ltra
-rw-rw---- &nbsp; 1 edipo &nbsp;wheel &nbsp; &nbsp;0 16 Set 09:44 umaskfile007
drwxrwx--- &nbsp; 2 edipo &nbsp;wheel &nbsp; 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 -&gt; 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- &nbsp; 1 edipo &nbsp;wheel &nbsp; &nbsp;0 16 Set 09:50 umask135file
drw-r---w- &nbsp; 2 edipo &nbsp;wheel &nbsp; 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 -&gt; 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-- &nbsp; 1 edipo &nbsp;wheel &nbsp; &nbsp;0 16 Set 09:54 umask242file
dr-x-wxr-x &nbsp; 2 edipo &nbsp;wheel &nbsp; 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.