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

时间:2019-01-10 17:05:22

标签: perl rules

我想使用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);
}

2 个答案:

答案 0 :(得分:3)

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)进行屏蔽。

答案 1 :(得分:-1)

使用File::Find::Rule很酷,但是您可以轻松地使用find并在perl中获得答案:

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