Estoy tratando de entender mejor los permisos, así que estoy haciendo algunos "ejercicios". Aquí hay una secuencia de comandos que estoy usando con sus respectivos resultados:
$ 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
Eso tiene sentido porque sabemos que los permisos de archivo predeterminados son 666
( rw-rw-rw-
) y los permisos predeterminados de directorios son 777
( rwxrwxrwx
). Si le resto el valor umask de estos permisos por defecto que tengo
666-022=644
, rw-r--r--
para el file1
, por lo que es coherente con la salida anterior;
777-022=755
,, rwx-r-x-r-x
para el dir1
, también coherente.
Pero si cambio el umask de 022
a, 021
ya no está.
Aquí está el ejemplo para el archivo:
$ umask 0021
$ touch file2
$ ls -l file2
-rw-r--rw- user group 0 Mar 16 13:33 file2
-rw-r--rw-
es 646
pero debería ser 666-021=645
. Por lo tanto, no funciona de acuerdo con el cálculo anterior.
Aquí está el ejemplo para el directorio:
$ touch dir2
$ ls -ld dir2
drwxr-xrw- 2 user group 4096 Mar 16 13:35 dir2
drwxr-xrw-
es 756
, 777-021=756
. Entonces, en este caso, el resultado es coherente con el cálculo anterior.
Leí al hombre pero no encontré nada sobre este comportamiento.
¿Alguien puede explicar por qué?
EXPLICACIÓN
Como se señaló en las respuestas: umask
el valor de 'no se resta matemáticamente del directorio predeterminado y los permisos del archivo.
La operación efectivamente involucrada es una combinación de operadores booleanos AND (&) y NOT (!). Dado:
R = permisos resultantes
D = permisos predeterminados
U = máscara actual
R = D y! U
Por ejemplo:
666 &! 0053 = 110110110 & ! 000 101 011 110 110 110 y 111 010 100 = 110 010 100 = 624 = rw - wr--
777 &! 0022 = 111 111 111 & ! 000 010 010 111 111 111 y 111 101 101 = 111101101 = 755 = rwxr - xr-x
PROPINA
Una manera fácil de conocer rápidamente los permisos resultantes (al menos me ayudó) es pensar que podemos usar solo 3 valores decimales:
r = 100 = 4
w = 010 = 2
x = 001 = 1
Los permisos serán una combinación de estos 3 valores.
" "
se utiliza para indicar que no se otorga el permiso relativo.
666 = 4+2+" " 4+2+" " 4+2+" " = rw rw rw
Entonces, si mi umask actual es 0053
, sé que estoy eliminando el (4+1)
permiso de lectura y ejecución del grupo y la escritura y ejecución (2+1)
de otro resultado en
4+2 " "+2+" " 4+" "+" " = 624 = rw--w-r--
(grupo y otros ya no tenían permiso de ejecución)