当我没有设置它时 chmod 允许写入

当我没有设置它时 chmod 允许写入

我有一个 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::rwxdefault: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将为您提供更大的灵活性,例如以不同的方式对待目录和常规文件。

相关内容