¿Por qué algunos valores de umask no tienen efecto?


9

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-xpara el dir1, también coherente.

Pero si cambio el umask de 022a, 021ya 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 646pero 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: umaskel 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)

Respuestas:


26

umaskes una máscara , no es un valor restado. Así:

  • modo 666, máscara 022: el resultado es 666 y ~ 022, es decir , 666 y 755, que es 644;
  • modo 666, máscara 021: el resultado es 666 y ~ 021, es decir , 666 y 756, que es 646.

Piensa en las partes involucradas. 6 en un modo significa que los bits 1 y 2 están configurados, leídos y escritos. 2 en una máscara enmascara el bit 1, el bit de escritura. 1 en una máscara enmascara el bit 0, el bit de ejecución.

Otra forma de representar esto es mirar los permisos en forma de texto. 666 es rw-rw-rw-; 022 es ----w--w-; 021 es ----w---x. La máscara deja caer sus bits establecidos del modo, por lo que rw-rw-rw-enmascarado se ----w--w-convierte rw-r--r--, enmascarado por se ----w---xconvierte rw-r--rw-.


11

Necesitas pensar en binario, no decimal. Específicamente, hay tres números binarios de 3 bits: uno para Propietario, Grupo y Otro. Cada uno con valores que van desde 000 a 111 (0-7 en decimal).

por ejemplo, rw-rw-rw (666) es 110 110 110.

El umaskvalor es una máscara que especifica qué bits estarán activados o desactivados (1 o 0) al crear un nuevo archivo o directorio. por ejemplo, 022 decimal es 000 010 010 binario, mientras que 021 decimal es 000 010 001

Los bits de permiso se AND-ed junto con la máscara de usuario negada para llegar al valor final. "negado" significa que todos los bits están invertidos, es decir, todos los 1 volteados a 0, y viceversa. p.ejNOT 022 (000 010 010) = 755 (111 101 101)

Ejemplo: 666 & !022 = 644. En binario, eso es:

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

Además 777 & !022 = 755:

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

Nótese cómo el valor final de cada bit sólo puede ser 1 si es 1, en tanto el valor original de la autorización (666 o 777) y en la máscara de usuario negada. Si cualquiera de ellos es 0, el resultado es 0. Es decir, 1 y 1 = 1 , mientras que 1 y 0 = 0 .


Estrictamente hablando, hay un cuarto número binario de 3 bits para los bits setuid, setgid y sticky. Es por eso que a menudo ve permisos y máscaras especificados con un 0 inicial (o algún otro número inicial de 0-7). por ejemplo, 0777 o 2755.


2
Bueno, técnicamente es octal, no decimal, pero eso realmente no cambia el núcleo de la respuesta.
David Z

@DavidZ: OP pensó que era decimal (vea el ejemplo de resta en la Q), que presumiblemente es a lo que se refería cas.
Carreras de ligereza en órbita

1
@Lightness los ejemplos de sustracción dados por el OP funcionan ya sea octal o decimal, dado que ningún dígito alcanza 8 y nunca hay necesidad de un carry. Estoy de acuerdo en que es posible que el OP estuviera pensando en decimal, pero nada en la pregunta lo prueba.
Stephen Kitt

@StephenKitt: Parece que mi dedo debe haberse deslizado en el teclado cuando estaba escribiendo ejemplos en calc.exe para demostrarlo 😂
Carreras de ligereza en órbita el

1
@cas sí, no estaba en desacuerdo con esa parte (también es la base de mi respuesta), solo con la afirmación de Lightness de que el OP estaba calculando en decimal en lugar de octal.
Stephen Kitt
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.