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.