Arrays Perl:乘法循环、1哈希和正则表达式
我陷入了循环(while&foreach)和AoH背后的逻辑。我有关于循环和散列数组的基本知识,但我不太明白如何将它们组合成一个简单的解决方案。我的任务是检查普通用户的密码期限,如果它早于n-天(最后一部分对我来说没问题,我知道如何解决它,使用GetOptions等) 为此,我想出了一个解决方案: 1将文件/etc/passwd加载到脚本中,执行正则表达式搜索以查找常规用户。Linux类系统中的普通用户的ID为1000或更高,因此我使用这个正则表达式来查找:Arrays Perl:乘法循环、1哈希和正则表达式,arrays,regex,perl,hash,perl-data-structures,Arrays,Regex,Perl,Hash,Perl Data Structures,我陷入了循环(while&foreach)和AoH背后的逻辑。我有关于循环和散列数组的基本知识,但我不太明白如何将它们组合成一个简单的解决方案。我的任务是检查普通用户的密码期限,如果它早于n-天(最后一部分对我来说没问题,我知道如何解决它,使用GetOptions等) 为此,我想出了一个解决方案: 1将文件/etc/passwd加载到脚本中,执行正则表达式搜索以查找常规用户。Linux类系统中的普通用户的ID为1000或更高,因此我使用这个正则表达式来查找: /(\w+[:]x[:]1[0-9]
/(\w+[:]x[:]1[0-9]{3}/
2将正则表达式的结果加载到数组中:
my (@Usernames, %pwdsettings);
while (my $pwdsettings = <$fh2>) {
if ($pwdsettings =~ /(\w+)[:]x[:]1[0-9]{3}/) {
$pwdsettings{"Username"} = $1;
push (@Usernames, \%pwdsettings);
}
}
4打开$pwdsett_dump
,然后执行第二次正则表达式搜索以获取上次密码更改的日期。之后,将结果加载到数组(AoH)内的现有哈希中:
输出时需要附加文件,即使用“>>”而不是“>”,这将覆盖文件。
system(“chage-l$\u>$pwdsett\u dump”)
在循环中运行时,每次循环执行时都会覆盖它。
使用:
foreach(@Usernames){
系统(“chage-l$\u>>$pwdsett\u转储”)
}
########示例脚本
#!/usr/bin/perl
严格使用;
使用警告;
my$usernames_dump=“/etc/passwd”;
打开(my$fh2),您需要在输出时附加文件,意思是使用“>>”而不是“>”,这将覆盖文件。
system(“chage-l$\u>$pwdsett\u dump”)
在循环中运行时,每次循环执行时都会覆盖它。
使用:
foreach(@Usernames){
系统(“chage-l$\u>>$pwdsett\u转储”)
}
########示例脚本
#!/usr/bin/perl
严格使用;
使用警告;
my$usernames_dump=“/etc/passwd”;
打开(my$fh2,“>”这是您仅获得1个用户输出的原因。感谢您的回答,但当@Usernames
传递到foreach循环时,它仍会生成sh:1:语法错误:“(@Usernames
意外,因为@Usernames
由哈希(0x21455d0)哈希(0x21612c0)
组成(出于某些该死的原因)
。我对chage
一无所知,但我怀疑您希望$\u
成为第一个循环中出现的$1
。在这种情况下,将推送(@Usernames,\%pwdsettings);
更改为推送(@Usernames,$1);
'>'您仅获得1个用户输出的原因。感谢您的回答,但当@Usernames
传递到foreach循环时,它仍会生成sh:1:语法错误:“(@Usernames
意外,因为@Usernames
由哈希(0x21455d0)哈希(0x21612c0)
(出于某些该死的原因)
。我对chage
一无所知,但我怀疑您希望$\u
成为第一个循环中出现的$1
。在这种情况下,将推送(@Usernames,\%pwdsettings);
更改为推送(@Usernames,$1);
'>'您仅获得1个用户输出的原因。感谢您的回答,但当@Usernames
传递到foreach循环时,它仍会生成sh:1:语法错误:“(@Usernames
意外,因为@Usernames
由哈希(0x21455d0)哈希(0x21612c0)
(出于某些该死的原因)
。我对chage
一无所知,但我怀疑您希望$\u
成为第一个循环中出现的$1
。在这种情况下,将推送(@Usernames,\%pwdsettings);
更改为推送(@Usernames,$1)
。
my $pwdsett_dump = "tmp/pwdsett-dump.txt";
...
foreach (@Usernames) {
system("chage -l $_ > $pwdsett_dump")
}
open (my $fh3, "<", $pwdsett_dump) or die "Could not open file '$pwdsett_dump': $!";
while (my $array = <$fh3>) {
if ($array =~ /^Last\s+password\s+change\s+:\s(\w{3})\s+(\d{2}),\s+(\d{4})/) {
$pwdsettings{"Month"} = $1;
$pwdsettings{"Day"} = $2;
$pwdsettings{"Year"} = $3;
}
}
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my $pwdsett_dump = "tmp/pwdsett-dump.txt";
my $usernames_dump = "tmp/usernames-dump.txt";
system("cat /etc/passwd > $usernames_dump");
open (my $fh2, "<", $usernames_dump) or die "Could not open file '$usernames_dump': $!";
my (@Usernames, %pwdsettings);
while (my $pwdsettings = <$fh2>) {
if ($pwdsettings =~ /(\w+)[:]x[:]1[0-9]{3}/) {
$pwdsettings{"Username"} = $1;
push (@Usernames, \%pwdsettings);
}
}
foreach (@Usernames) {
system("chage -l $_ > $pwdsett_dump")
}
open (my $fh3, "<", $pwdsett_dump) or die "Could not open file '$pwdsett_dump': $!";
while (my $array = <$fh3>) {
if ($array =~ /^Last\s+password\s+change\s+:\s(\w{3})\s+(\d{2}),\s+(\d{4})/) {
$pwdsettings{"Month"} = $1;
$pwdsettings{"Day"} = $2;
$pwdsettings{"Year"} = $3;
}
}
print Dumper \@Usernames;
foreach (@Usernames) {
system("chage -l $_ >> $pwdsett_dump")
}
########sample script
#!/usr/bin/perl
use strict;
use warnings;
my $usernames_dump = "/etc/passwd";
open (my $fh2, "<", $usernames_dump) or die "Could not open file '$usernames_dump': $!";
my @pwdsettings;
my $i =0;
my @pwdsett_dump;
while (<$fh2>) {
if ($_ =~ /(\w+)[:]x[:]1[0-9]{3}/) {
my @user = split(/:/, $_);
$pwdsettings[$i] = $user[0];
$pwdsett_dump[$i] = `chage -l $user[0]|grep Last`;
$pwdsett_dump[$i] =~ s/Last.*://;
$pwdsett_dump[$i] =~ s/,//;
my @m = split(/ /,$pwdsett_dump[$i]);
print "$user[0]\t Date: $m[2] Month: $m[1] Year: $m[3]\n";
$i++;
}
}
Output: testuser Date: 12 Month: May Year: 2015