¿Puedo anular mi umask usando ACL para que todos los archivos creados en un directorio dado sean legibles?

11

Suponga que mi umask es 0077.

Tengo un directorio fooque deseo que se le apliquen permisos especiales. Todos los archivos que creo foodeben ser legibles en todo el mundo, y todos los directorios deben ser legibles y ejecutables en todo el mundo.

Actualmente, si creo un archivo, será 0600 y un directorio será 0700:

$ cd foo/
$ touch file
$ mkdir directory
$ ls -l
drwx------ 2 nfm nfm 4096 2012-01-12 16:16 directory
-rw------- 1 nfm nfm    0 2012-01-12 16:15 file

Quiero que el archivo sea 0644 y el directorio 0755, independientemente de mi umask:

drwxr-xr-x 2 nfm nfm 4096 2012-01-12 16:16 directory
-rw-r--r-- 1 nfm nfm    0 2012-01-12 16:15 file

¿Cómo puedo conseguir esto?

stickmangumby
fuente
No intentaste buscar en Google "umask por directorio", ¿verdad? Si tuviera los permisos, lo votaría negativamente por esto, porque el tercer golpe es un truco para hacer exactamente lo que quiere (otorgado, solo para USTED, no para otros usuarios).
Brett Dikeman
3
@BeeDee Lo vi. Estoy interesado en otras formas de hacerlo, con suerte usando ACL. Prefiero no verificar / cambiar mi umask en cada cd, o anular las funciones de bash.
stickmangumby

Respuestas:

14

Sí, acl's puede hacer esto.

  1. Asegúrese de que su sistema de archivos esté montado con acl. Para verificar esto, escriba mount. Debería ver 'acl' entre otros permisos, por ejemplo:

    /dev/sda1 on / type ext4 (rw,errors=remount-ro,acl)
    

    Si no está montado con acl, abra / etc / fstab y agregue 'acl' a la lista de opciones:

    # /etc/fstab: static file system information.
    #
    # <file system> <mount point>   <type>   <options>       <dump>  <pass>
    /dev/sda1       /          ext3     noatime,errors=remount-ro,acl 0       1
    

    Ahora, vuelva a montar el sistema de archivos en ejecución con las nuevas opciones:

    mount -v -o remount /
    
  2. Instale las utilidades de acl. En ubuntu / debian, esto es:

    sudo apt-get install acl
    
  3. Tus nuevos amigos son setfacly getfacl. Use setfaclpara cambiar la acl predeterminada para un directorio:

    setfacl -d -m o:r foo
    

    -destablece el valor predeterminado, -mmodifica acl y o:rotorga a "otro" el derecho de leer. Establecer el valor predeterminado en un directorio es más o menos equivalente a establecer setgid en un directorio, pero en lugar de los archivos recién creados que heredan el grupo, heredan el acl. Juntos, setgid y acl pueden ser poderosos, ya que puede otorgar permisos predeterminados a un grupo y obtener archivos recién creados para que pertenezcan a ese grupo, para una umask por directorio efectiva basada en grupos.

  4. Verifique su trabajo: ls -lahora debería mostrar un "+" adicional que indica la presencia de acl además de los permisos de archivo estándar.

    % ls -la foo/
    drwxr--r--+
    

    Puede obtener información detallada sobre el acl usando getfacl.

    % getfacl foo
    # file: foo
    # owner: you
    # group: you
    user::rwx
    group::r--
    other::r--
    default:user::rwx
    default:group::---
    default:other::r--
    
usuario67641
fuente
1
Esto no parece estar funcionando para mí. setfacly getfaclestán devolviendo el resultado esperado, pero solo los directorios (no los archivos) dentro del directorio padre heredan el acl, e incluso entonces mi umask tiene prioridad sobre el valor predeterminado (si no son legibles en todo el mundo, default:other::r--no permite que otro usuario acceder a ellos). ¿Me he perdido algo obvio?
stickmangumby
Una cosa que he encontrado (tal vez este es el problema): el facl parece usar el primero de (usuario, grupo, otro) con el que coincide el usuario actual. Es decir, si pertenece al grupo para el archivo, se procesará la acl para el grupo, no la acl para otro. Sin embargo, la acl aún debe heredarse si aplicó el directorio con -d ...
user67641
Hm, lo intenté de nuevo y todo funcionó bien. Lo siento, ¡no estoy seguro de lo que hice mal la primera vez! Gracias :)
stickmangumby
2

También puede forzar una umask para el directorio estableciendo la propiedad ACL de máscara de esta manera:

setfacl -d -m mask:07 .
Saustrup
fuente
-4

Simplemente instale OnDir y configúrelo adecuadamente según sus necesidades. He respondido un problema similar ubicado aquí .

bintut
fuente
La pregunta no menciona nada acerca de atravesar directorios con un terminal, que es para qué sirve OnDir.
Yarin