【问题标题】:How to use Perl's File::Find::Rule module to find files with 777 perms如何使用 Perl 的 File::Find::Rule 模块查找具有 777 权限的文件
【发布时间】:2019-01-10 17:05:22
【问题描述】:

我想使用 perl File::Find::Rule 来查找服务器中具有 perms 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);
}

【问题讨论】:

    标签: perl rules


    【解决方案1】:

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

    【讨论】:

    • 您需要以某种方式转换模式输出的基数吗?如果我在文件上运行 stats 命令,我会得到 33279 的值,八进制表示 100777? 777之前的3个ciffer是什么?我假设它是 uid/gid?
    • 不,这些是文件类型和 setuid/setgid/sticky 位。八进制只是表示整数的另一种方式,因此为了比较程序中的值,您不需要转换任何内容 - 在 Perl 源代码中,010077733279 相同。对于八进制输出,您可以使用printf/sprintf,例如printf "%04o", 0644; 打印0644。要将包含八进制数的 Perl 字符串转换为整数,Perl 提供了 oct 函数:print oct("664"); 打印 436,换句话说,oct("664") == 436 == 0664
    【解决方案2】:

    使用File::Find::Rule 很酷,但您可以使用find 轻松做到这一点,并在perl 中返回答案:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      • 2012-05-09
      相关资源
      最近更新 更多