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 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
, então é coerente com a saída anterior;
777-022=755
, rwx-r-x-r-x
, para o dir1
, também coerente.
Mas se eu mudar o umask de 022
para 021
ele 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 por quê?
EXPLICAÇÃO
Conforme apontado nas respostas: umask
o valor de não é subtraído matematicamente do diretório padrão e das permissões do arquivo.
A operação efetivamente envolvida é uma combinação dos 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 101 011 110 110 110 & 111 010 100 = 110 010 100 = 624 = rw--wr--
777& !0022 = 111 111 111 & !000 010 010 111 111 111 & 111 101 101 = 111 101 101 = 755 = rwxr--xr-x
GORJETA
Uma maneira fácil de saber rapidamente as permissões resultantes (pelo menos me ajudou) é pensar que podemos usar apenas 3 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 é dada.
666 = 4+2+" " 4+2+" " 4+2+" " = rw rw rw
Portanto, se minha umask atual for 0053
, sei que estou removendo (4+1)
permissão de leitura e execução do grupo e gravação e execução (2+1)
de outro, resultando em
4+2 " "+2+" " 4+" "+" " = 624 = rw--w-r--
(grupo e outros já não tinham permissão de execução)
umask
é uma máscara , não é um valor subtraído. Desta forma:Pense nas partes envolvidas. 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 em forma de texto. 666 é
rw-rw-rw-
; 022 é----w--w-
; 021 é----w---x
. A máscara descarta seus bits definidos do modo, entãorw-rw-rw-
mascarado por----w--w-
torna -serw-r--r--
, mascarado por----w---x
torna -serw-r--rw-
.Você precisa pensar em binário, não em decimal. Especificamente, existem três números binários de 3 bits: um para Proprietário, Grupo e Outro. Cada um com valores que variam de 000 a 111 (0-7 em decimal).
por exemplo, rw-rw-rw (666) é 110 110 110.
O
umask
valor é uma máscara que especifica quais bits serã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 001Os bits de permissão são adicionados juntamente com o umask negado para chegar ao valor final. "negado" significa que todos os bits estão invertidos, ou seja, todos os 1s convertidos em 0 e vice-versa. por exemplo
NOT 022 (000 010 010) = 755 (111 101 101)
Exemplo:
666 & !022 = 644
. Em binário, isso é:Além disso
777 & !022 = 755
,:Observe como o valor final de cada bit só pode ser 1 se for 1 no valor de permissão original (666 ou 777) E no umask negado. 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ê costuma ver 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.