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

Я хочу использовать 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 ]

0 голосов
/ 15 февраля 2019

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

@files = split /\n/, `/bin/find /root -perm 777`;
0 голосов
/ 10 января 2019

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

...