Как использовать модуль Perl File :: Find :: Rule для поиска файлов с разрешением 777

Вопрос задан: 8 месяцев назад Последняя активность: 7 месяцев назад
up 3 down

Я хочу использовать Perl File :: Find :: Rule для того, чтобы найти на сервере файлы с разрешением 777

Я знаю, что модуль имеет тесты статистики, поэтому я мог бы просто сделать это:

$rule->mode(33279)

Я нашел 33279, создав файл и распечатав на нем разрешение, предполагая, что File :: Find :: Rule принимает десятичное число? или это нужно как-то отформатировать?

Правильный ли это подход, чтобы все файлы имели разрешения 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 ответа

up 3 down accepted

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).

up -1 down

С помощью File::Find::Rule это круто, но вы могли бы сделать это легко с find и получить ответы обратно в Perl:

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