Por que alguns valores de umask não são efetivados?

8

Estou tentando entender melhor as permissões, então estou fazendo alguns "exercícios". Aqui está uma seqüência de comandos que estou usando com suas respectivas saídas:

$ umask
0022
$ touch file1
$ ls -l file1
-rw-r--r-- 1 user group 0 Mar 16 12:55 file1
$ mkdir dir1
$ ls -ld dir1
drwxr-xr-x 2 user group 4096 Mar 16 12:55 dir1

Isso faz sentido porque sabemos que as permissões de arquivo padrão são 666 ( rw-rw-rw- ) e as permissões padrão de diretórios são 777 ( rwxrwxrwx ). Se eu subtrair o valor umask dessas permissões padrão, tenho 666-022=644 , rw-r--r-- , para o file1 , por isso é coerente com a saída anterior; 777-022=755 , rwx-r-x-r-x , para o dir1 , também coerente.

Mas se eu mudar a umask de 022 para 021 , não é mais.

Aqui está o exemplo para o arquivo:

$ umask 0021
$ touch file2
$ ls -l file2
-rw-r--rw- user group 0 Mar 16 13:33 file2

-rw-r--rw- é 646 , mas deve ser 666-021=645 . Por isso, não funciona de acordo com o cálculo anterior.

Aqui está o exemplo para o diretório:

$ touch dir2
$ ls -ld dir2
drwxr-xrw- 2 user group 4096 Mar 16 13:35 dir2

drwxr-xrw- é 756 , 777-021=756 . Portanto, neste caso, o resultado é coerente com o cálculo anterior.

Eu li o cara, mas não encontrei nada sobre esse comportamento.

Alguém pode explicar por quê?

EXPLICAÇÃO

Como apontado nas respostas: o valor de umask não é subtraído matematicamente do diretório padrão e das permissões do arquivo.

A operação efetivamente envolvida é uma combinação de operadores booleanos AND (&) e NOT (!). Dado:

R = permissões resultantes em D = permissões padrão U = umask atual

R = D & ! U

Por exemplo:

666& !0053 = 110 110 110 & 
            !000 101 011 
             110 110 110 &  
             111 010 100
           = 110 010 100 = 624 = rw--w-r--
 
777& !0022 = 111 111 111 & 
            !000 010 010
             111 111 111 &  
             111 101 101
           = 111 101 101 = 755 = rwxr--xr-x 

DICA

Uma maneira fácil de saber rapidamente as permissões resultantes (pelo menos me ajudou) é pensar que podemos usar apenas três valores decimais:

r = 100 = 4 
w = 010 = 2
x = 001 = 1

As permissões serão uma combinação desses três valores.
" " é usado para indicar que a permissão relativa não é fornecida.

666 = 4+2+" "   4+2+" "   4+2+" "  = rw rw rw  

Portanto, se a minha umask atual for 0053 , sei que estou removendo a leitura e a execução (4+1) permission do grupo e a gravação e execução (2+1) de outras resultando em

 4+2     " "+2+" "     4+" "+" "   = 624 = rw--w-r--  

(grupo e outros já não tinham permissão de execução)

Esperar é claro.

    
por ikeDiM 16.03.2018 / 13:39

2 respostas

25

umask é uma máscara , não é um valor subtraído. Assim:

  • modo 666, máscara 022: o resultado é 666 & ~ 022, i.e. 666 & 755, que é 644;
  • modo 666, máscara 021: o resultado é 666 & ~ 021, i.e. 666 & 756, que é 646.

Pense nos bits envolvidos. 6 em um modo significa que os bits 1 e 2 são definidos, lidos e gravados. 2 em uma máscara mascara o bit 1, o bit de gravação. 1 em uma máscara mascara o bit 0, o bit de execução.

Outra maneira de representar isso é observar as permissões no formato de texto. 666 é rw-rw-rw- ; 022 é ----w--w- ; 021 é ----w---x . A máscara descarta seus bits definidos do modo, portanto rw-rw-rw- mascarado por ----w--w- se torna rw-r--r-- , mascarado por ----w---x se torna rw-r--rw- .

    
por 16.03.2018 / 13:45
10

Você precisa pensar em binário, não em decimal. Especificamente, há três números binários de 3 bits: um para cada proprietário, grupo e outro. Cada um com valores variando de 000 a 111 (0 a 7 em decimais).

por exemplo. rw-rw-rw (666) é 110 110 110.

O valor umask é uma máscara que especifica quais bits estarão ativados ou desativados (1 ou 0) ao criar um novo arquivo ou diretório. por exemplo. 022 decimal é 000 010 010 binário, enquanto 021 decimal é 000 010 001

Os bits de permissão são AND-ed junto com a umask negada para chegar ao valor final. "negado" significa que todos os bits estão invertidos, isto é, todos os 1s são invertidos para 0 e vice-versa. por exemplo. NOT 022 (000 010 010) = 755 (111 101 101)

Exemplo: 666 & !022 = 644 . Em binário, isso é:

  Owner  Group  Other     mode
   110    110    110      666 
&  111    101    101      755   (this is the negated 022)
   ---    ---    ---      ---
   110    100    100      644

Além disso, 777 & !022 = 755 :

  Owner  Group  Other     mode
   111    111    111      777 
&  111    101    101      755
   ---    ---    ---      ---
   111    101    101      755

Note que o valor final de cada bit só pode ser 1 se for 1 em ambos o valor da permissão original (666 ou 777) AND na umask negada. Se qualquer um deles for 0, o resultado será 0. Ou seja, 1 & 1 = 1 , enquanto 1 & 0 = 0 .

Estritamente falando, há um quarto número binário de 3 bits para os bits setuid, setgid e sticky. É por isso que você vê frequentemente permissões e máscaras especificadas com um 0 inicial (ou algum outro número inicial de 0 a 7). por exemplo. 0777 ou 2755.

    
por 16.03.2018 / 14:03