使用perl查找每个人可写的文件

时间:2014-02-19 03:26:59

标签: perl file-permissions stat

我正在编写一个Perl脚本,它将扫描文件系统以查找每个人都可写的文件。我看过一些帮助过我的东西。主要是this Stonehenge.com post from 2001a question previously asked here。两者都指导我完成大部分解决方案。我现在能够找到每个人都可写的文件,但是,我有一些顾虑。

首先,我的剧本:

#!/usr/bin/perl

use warnings;
use strict;
use File::Find;
use Sys::Hostname;

my $hostname = hostname;
my $file = "/tmp/$hostname" . "_ww_files.txt";

open (WWFILE, ">>$file");

find sub {
  return unless (stat)[2] & 00002; # ...and world writeable
  return if "$File::Find::name" =~ m/(\/tmp)|(^\/dev)/;
  print "$File::Find::name\n";

}, "/";

我首先担心的是,当我运行脚本时,它经常会在几个声明Use of uninitialized value in bitwise and (&) at ./ww_files.pl line 15.的文件上抛出错误。当然,这是检查文件模式然后执行按位AND的行,以便仅查找每个八位字节的第二列中具有“w”的那些。或者我想相信,但我很确定我并不是真的想用这种方法寻找合适的权限。

要明确这一点,我所关心的只是“w”。我不在乎文件是否可供所有人阅读,甚至不是每个人都可执行。所以我想通过我应该问的问题的第二个问题是,除了“w”之外,为了忽略除了W之外的所有内容,应该使用AND掩码?

2 个答案:

答案 0 :(得分:1)

从File :: Find docs“如果您使用警告pragma,File :: Find将报告几种奇怪情况的警告。”我不会太担心他们。为了确定掩码,你可以使用来自Fcntl的常量S_IWOTH:

use Fcntl ':mode';
use File::Find;
no warnings 'File::Find';

find sub {
    return unless (stat)[2] & S_IWOTH; # ...and world writeable

答案 1 :(得分:0)

可能文件无法stat,因此值未定义。但是,您可以轻松地捕获它;

my @s = stat();
unless (@s) {
    warn "$File::Find::name: stat failed: $!\n";
    return;
}
return unless $s[2] & 0x02;

一般来说,您应该检查系统调用的返回值是否有错误。

掩码值2对于查找世界可写文件非常正确。但是,也许您还想检查奇怪的组可写文件,其中组是奇怪的?