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::rwx
y default:mask::rwx
. ¿Podría ser eso lo que está causando el problema?
Respuesta1
Mire el resultado del error: debería ver find: `…' Permission denied
errores. 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 chmod
comandos 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::Find
en lugar de llamar al programa externo find
. Utilice la finddepth
funció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 0750
o lo que debería ser. El uso File::Find
le dará mayor flexibilidad para, por ejemplo, tratar directorios y archivos normales de forma diferente.