chmod permite escribir cuando no lo estoy configurando

chmod permite escribir cuando no lo estoy configurando

Tengo un script en Perl que cambia sistemáticamente los permisos. Lo primero que hace el script es eliminar todos los permisos. Lo hace llamando chmod(desde perl). Hice esto porque descubrí que el bit guid establecido no se borraba a menos que lo borrara explícitamente:

system('find',
        $topdir,
        '-exec', 'chmod', 'u-swrx,g-swrx,o-swrx', '{}', ';'
);

Establecí diferentes permisos para grupos y directorios. Usando find, lo llamo desde perl de la siguiente manera (en este caso para directorios):

system(
    'find',
    $topdir,
    '-type', 'd',
    '-exec', 'chmod', 'g=rx', '{}', ';'
  );

Ahora, aunque solo configuré rx, cuando verifico los permisos del archivo después de que el script haya terminado de ejecutarse, los scripts parecen tener rwx. ¿Hay algo a lo que debo prestar atención, ya que no entiendo muy bien por qué sucede esto? No lo configuro explícitamente en ningún lado. También configuro ACL, pero todas se comportan como se esperaba. Lo único que veo cuando consulto getfacl es mask::rwxy default:mask::rwx. ¿Podría ser eso lo que está causando el problema?

Respuesta1

Mire el resultado del error: debería ver find: `…' Permission deniederrores. Lo primero que debe hacer es eliminar todos los permisos de acceso $topdir, lo que evita que se recurra más a él. Ninguno de los chmodcomandos que espera se ejecuta excepto el primero.

Si desea eliminar el permiso para acceder a todos los directorios de un árbol, debe hacerlo de adentro hacia afuera. De lo contrario, una vez que se haya desconectado del directorio principal, no podrá volver a acceder a él.

system('find',
        $topdir,
        '-depth',
        '-exec', 'chmod', 'u-swrx,g-swrx,o-swrx', '{}', ';'
);

Ya que estás usando Perl, usaFile::Finden lugar de llamar al programa externo find. Utilice la finddepthfunción para obtener el orden transversal correcto.

Parece inútil hacer dos recorridos. En su lugar, haga un recorrido único y establezca directamente los permisos del archivo según lo que desee, por ejemplo, chmod 0750o lo que debería ser. El uso File::Findle dará mayor flexibilidad para, por ejemplo, tratar directorios y archivos normales de forma diferente.

información relacionada