¿Establecer permisos predeterminados para archivos y subdirectorios recién creados bajo un directorio en Linux?


Tengo un montón de scripts y aplicaciones de larga duración que están almacenando los resultados de salida en un directorio compartido entre unos pocos usuarios. Me gustaría una forma de asegurarme de que todos los archivos y directorios creados bajo este directorio compartido tengan automáticamente u=rwxg=rwxo=r permisos.

Sé que podría usar umask 006 a la cabeza de mis varios scripts, pero no me gusta ese enfoque, ya que muchos usuarios escriben sus propios scripts y pueden olvidarse de establecer el umask ellos mismos.

Realmente solo quiero sistema de archivos para establecer los archivos y directorios recién creados con un permiso determinado si se encuentra en una carpeta determinada. Es esto posible?

Update : I think it can be done with POSIX ACLs, using the Default ACL functionality, but it's all a bit over my head at the moment. Si alguien puede explicar cómo usar las ACLs por defecto, probablemente respondería esta pregunta muy bien.

Author: rmunn, 2009-02-24

4 answers

Para obtener la propiedad correcta, puede establecer el bit setuid del grupo en el directorio con

chmod g+rwxs dirname

Esto asegurará que los archivos creados en el directorio sean propiedad del grupo. Entonces debería asegurarse de que todo el mundo se ejecuta con umask 002 o 007 o algo de esa naturaleza---esta es la razón por la que Debian y muchos otros sistemas linux están configurados con grupos por usuario por defecto.

No conozco una manera de forzar los permisos que desea si la máscara de usuario es demasiado fuerte.

 71
Author: Norman Ramsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-24 05:37:26

Aquí está cómo hacerlo usando ACL por defecto, al menos bajo Linux.

Primero, es posible que necesite habilitar el soporte ACL en su sistema de archivos. Si está utilizando ext4, entonces ya está habilitado. Otros sistemas de archivos (por ejemplo, ext3) necesitan ser montados con la opción acl. En ese caso, agregue la opción a su /etc/fstab. Por ejemplo, si el directorio se encuentra en su sistema de archivos raíz:

/dev/mapper/qz-root   /    ext3    errors=remount-ro,acl   0  1

Luego vuelve a montarlo:

mount -oremount /

Ahora, use el siguiente comando para establecer el valor predeterminado ACL:

setfacl -dm u::rwx,g::rwx,o::r /shared/directory

Todos los archivos nuevos en /shared/directory ahora deben obtener los permisos deseados. Por supuesto, también depende de la aplicación que crea el archivo. Por ejemplo, la mayoría de los archivos no serán ejecutables por nadie desde el principio (dependiendo del argumento mode hasta la llamada open(2) o creat(2)), al igual que cuando se usa umask. Algunas utilidades como cp, tar, y rsync intentará preservar los permisos del archivo(s) fuente (s) que enmascararán su ACL predeterminado si el archivo fuente no fue grupo-escribible.

Espero que esto ayude!

 55
Author: pelle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-20 12:22:33

Es feo, pero puede usar el comando setfacl para lograr exactamente lo que desea.

En una máquina Solaris, tengo un archivo que contiene las acl para usuarios y grupos. Desafortunadamente, tienes que enumerar todos los usuarios (al menos no pude encontrar una manera de hacer que esto funcione de otra manera):

user::rwx
user:user_a:rwx
user:user_b:rwx
...
group::rwx
mask:rwx
other:r-x
default:user:user_a:rwx
default:user:user_b:rwx
....
default:group::rwx
default:user::rwx
default:mask:rwx
default:other:r-x

Nombre el archivo acl.lst y rellene sus nombres de usuario reales en lugar de user_X.

Ahora puede establecer esas acl en su directorio emitiendo el siguiente comando:

setfacl -f acl.lst /your/dir/here
 4
Author: innaM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-24 10:01:39

En tu script de shell (o .bashrc) puedes usar algo como:

umask 022

umask es un comando que determina la configuración de una máscara que controla cómo se establecen los permisos de archivo para los archivos recién creados.

 3
Author: user3270784,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-22 18:04:33