Estou tentando entender melhor as permissões, então estou fazendo alguns "exercícios". Aqui está uma sequência de comandos que estou usando com a respectiva saída:
$ 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ório são 777
( rwxrwxrwx
). Se eu subtrair o valor umask dessas permissões padrão 666-022=644
, tenho
rw-r--r--
, para o file1
, portanto, é 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 deveria ser 666-021=645
. Portanto, 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 homem, mas não encontrei nada sobre esse comportamento.
Alguém pode explicar o porquê?
EXPLICAÇÃO
Conforme indicado nas respostas: umask
o valor de não é matematicamente subtraído 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
D = permissões padrão
U = umask atual
R = D &! U
Por exemplo:
666 &! 0053 = 110 110 110 & 000 000 011 110 110 110 & 111 010 100 = 110 010 100 = 624 = rw - wr--
777 &! 0022 = 111 111 111 & 000 000 010 010 111 111 111 & 111 101 101 = 111 101 101 = 755 = rwxr - xr-x
GORJETA
Uma maneira fácil de conhecer rapidamente as permissões resultantes (pelo menos isso 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 3 valores.
" "
é usado para indicar que a permissão relativa não é fornecida.
666 = 4+2+" " 4+2+" " 4+2+" " = rw rw rw
Portanto, se minha umask atual for 0053
sei que estou removendo a (4+1)
permissão de leitura e execução 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 outro já não tinham permissão de execução)