【发布时间】:2015-11-14 00:18:22
【问题描述】:
我的模块中有子例程,它使用shadow 文件上的正则表达式搜索检查(常规)用户密码年龄:
Module.pm
my $pwdsetts_dump = "tmp/shadow_dump.txt";
system("cat /etc/shadow > $pwdsetts_dump");
open (my $fh1, "<", $pwdsetts_dump) or die "Could not open file '$pwdsetts_dump': $!";
sub CollectPWDSettings {
my @pwdsettings;
while (my $array = <$fh1>) {
if ($array =~ /^(\S+)[:][$]\S+[:](1[0-9]{4})/) {
my $pwdchange = "$2";
if ("$2" eq "0") {
$pwdchange = "Next login";
}
my %hash = (
"Username" => $1,
"Last change" => $pwdchange
);
push (@pwdsettings, \%hash);
}
}
my $current_date = int(time()/86400); # epoch
my $ndate = shift @_; # n-days
my $search_date = int($current_date - $ndate);
my @sorted = grep{$_->{'Last change'} > $search_date} @pwdsettings;
return \@sorted;
}
脚本分为两个步骤: 1.加载所有密码设置 2. 搜索超过n天的密码
在我的主脚本中,我使用以下脚本:
my ($user_changed_pwd);
if (grep{$_->{'Username'} eq $users_to_check} @{Module::CollectPWDSettings("100")}) {
$user_changed_pwd = "no";
}
else {
$user_changed_pwd = "yes";
}
问题出现在第一步,AoH 永远不会被填充。我也很确定这个子例程一直对我有用,strict 和 warnings 从来没有抱怨过,现在疯了,由于某种原因它拒绝工作。
【问题讨论】:
-
如果您在返回前使用
Data::Dumper和print Dumper \@pwdsettings;,您会得到什么?我的钱会花在grep过滤太多。 -
Dumper 返回
$VAR1 = [];,@pwdsettings 始终为空。 -
好的。所以这意味着上游问题 - 您的
/etc/shadow对运行脚本的用户是否可读? (你为什么cating它,然后还是打开hte tmp文件?) -
其他可能性是 - 正则表达式不匹配。您可以尝试打印
$array和%hash(同样,通过Dumper)。 -
是的,脚本正在从 sudo 运行。我更改它只是为了查看模块是否会从影子文件创建 .txt 文件,看看它是否是权限问题。