如何使用 Perl 的 File::Find::Rule 模块查找具有 777 权限的文件

How to use Perl's File::Find::Rule module to find files with 777 perms

我想使用 perl File::Find::Rule 以便在服务器中查找具有权限 777

的文件

我知道该模块有统计测试,所以我可以简单地这样做:

$rule->mode(33279)

假设 File::Find::Rule 取小数,我通过创建一个文件并在其上打印权限找到了 33279?还是应该以某种方式格式化?

这是让所有文件完全具有 777 权限的正确方法吗?

这是一个在测试服务器的主目录中查找所有文件的脚本。我想更改它,以便它只查找具有 777 权限的文件。

#!/usr/bin/perl
use strict;
use warnings;
use File::Find::Rule;

my $rule = File::Find::Rule->new;
$rule->file;
$rule->name( '*' );
my @files = $rule->in( "/root" );

for my $file (@files) {
     my $mode = (stat $file)[2];
     printf ("%04o %s\n",$mode & 07777, $file);
}

mode包括文件权限和类型。您需要屏蔽它,以便您只获得权限位。我个人会实施自定义规则:

use warnings;
use strict;
use File::stat;
use Fcntl qw/S_IMODE/;
use File::Find::Rule 'rule';

my $rule = rule->file->exec(sub{ S_IMODE(stat($_[2])->mode)==0777 });

my @files = $rule->in('/root');
for my $file (@files) {
    print $file, "\n";
}

请注意,此屏蔽模式仍包含 setuid/setgid/sticky 位(通常称为 Xst)。如果你也想忽略那些,只检查 ugo/rwx 位,那么你必须屏蔽 0777 (例如 $mode & 0777)。

使用 File::Find::Rule 很酷,但您可以使用 find 轻松完成并在 perl 中得到答案:

@files = split /\n/, `/bin/find /root -perm 777`;