我有一个 perl 脚本,可以系统地更改权限。该脚本所做的第一件事是删除所有权限。它通过调用chmod
(从 perl)来完成此操作。我这样做是因为我发现设置的 guid 位不会清除,除非我明确清除它:
system('find',
$topdir,
'-exec', 'chmod', 'u-swrx,g-swrx,o-swrx', '{}', ';'
);
我为组和目录设置了不同的权限。使用find
,我从 perl 中调用它,如下所示(在本例中为目录):
system(
'find',
$topdir,
'-type', 'd',
'-exec', 'chmod', 'g=rx', '{}', ';'
);
现在,即使我只设置了 rx,当我在脚本执行完成后检查文件权限时,脚本似乎具有 rwx。有什么我应该注意的吗,因为我不太明白为什么会发生这种情况;我没有在任何地方明确设置它。我也设置了 ACL,但它们的行为都符合预期。当我检查 getfacl 时,我看到的唯一值得注意的是mask::rwx
和default:mask::rwx
。这可能是导致问题的原因吗?
答案1
查看错误输出:您应该看到find: `…' Permission denied
错误。您要做的第一件事是删除 的所有访问权限$topdir
,这可以防止进一步递归到其中。chmod
除了第一个命令之外,您期望的命令都不会执行。
如果要删除访问树中所有目录的权限,则需要从内到外进行操作。否则,一旦您脱离了父目录,就无法再递归到该目录。
system('find',
$topdir,
'-depth',
'-exec', 'chmod', 'u-swrx,g-swrx,o-swrx', '{}', ';'
);
由于您使用的是 Perl,因此请使用File::Find
而不是调用外部程序find
。使用该finddepth
函数获得正确的遍历顺序。
进行两次遍历似乎没有意义。相反,进行一次遍历并直接将文件权限设置为您想要的,例如chmod 0750
或任何应该设置的权限。使用File::Find
将为您提供更大的灵活性,例如以不同的方式对待目录和常规文件。