usuario una todos tabla sobre permisos los dar carpeta archivos linux unix umask

linux - una - umask 077



linux: ¿obteniendo umask de un proceso ya en ejecución? (5)

A partir de Linux kernel 4.7, umask está disponible en /proc/<pid>/status .

¿Cómo puedo verificar la umask de un programa que se está ejecutando actualmente?

[actualización: otro proceso, no el proceso actual.]


Del manual de GNU C Library:

Aquí hay un ejemplo que muestra cómo leer la máscara con umask sin cambiarla permanentemente:

mode_t read_umask (void) { mode_t mask = umask (0); umask (mask); return mask; }

Sin embargo, es mejor usar getumask si solo quiere leer el valor de la máscara, porque es reentrante (al menos si usa el sistema operativo GNU).

getumask es específico de glibc, sin embargo. Entonces, si valora la portabilidad, entonces la solución sin reentrada es la única que existe.

Editar: acabo de buscar ->umask través del código fuente de Linux. No hay ningún lugar que te traiga la máscara de un proceso diferente. Además, no hay getumask ; aparentemente eso es solo cosa de Hurd.


Puede adjuntar gdb a un proceso en ejecución y luego llamar a umask en el depurador:

(gdb) call umask(0) [Switching to Thread -1217489200 (LWP 11037)] $1 = 18 (gdb) call umask(18) $2 = 0 (gdb)

(nota: 18 = O22)

Esto sugiere que puede haber una manera realmente fea de obtener umask usando ptrace.


Si eres el proceso actual, puedes escribir un archivo en / tmp y verificar su configuración. Una mejor solución es llamar a umask (3) pasando el cero - la función devuelve el ajuste antes de la llamada - y luego reiniciarlo volviendo a pasar ese valor a umask.

La umask para otro proceso no parece estar expuesta.


Un colega me acaba de mostrar un patrón de línea de comando para esto. Siempre tengo emacs en ejecución, así que eso está en el ejemplo de abajo. El perl es mi contribución:

sudo gdb --pid=$(pgrep emacs) --batch -ex ''call/o umask(0)'' -ex ''call umask($1)'' 2> /dev/null | perl -ne ''print("$1/n")if(/^/$1 = (/d+)$/)''