如果用户未锁定,我想扫描 passwd 文件并仅打印行。也就是说,passwd -S $user
不会返回“密码:已锁定”。我可以在ksh中轻松完成。在Perl中执行此操作的最佳方法是什么?
答案 0 :(得分:2)
与单行相同。
sudo perl -F: -lane 'print $F[0] if $F[1]!~/^!/' /etc/shadow
答案 1 :(得分:1)
此前,此答案报告了如何仅打印锁定的用户。错误纠正了。
在Linux上,锁定的用户帐户的密码以'!'
开头。您可以使用以下命令解析以冒号分隔的/etc/shadow
文件:
# Run as root with /etc/shadow as program argument
while (<>) {
chomp;
my ($user, $password, $remainder) = split /:/, $_, 3;
print $user."\n" unless $password =~ /^!/;
}
编辑:另一种便携式方法是使用getpwent功能:
# Must run as root
while (my ($user, $password) = getpwent) {
print $user."\n" unless $password =~ /^!/;
}
注意:您需要是root用户才能从/etc/shadow
读取用户的密码,并了解用户是否被锁定。
答案 2 :(得分:0)
我不确定您是否正在寻找命令行方式来执行此操作,以下代码假定passwd -S的输出完全您是如何指定它的(这可能在实践中不起作用),但这是一种方法:
cat /etc/passwd | perl -ne '$user = (split /:/)[0]; print "$user\n" if `passwd -S $user` ne "Password: locked"'
在实践中,最后你可能需要某种毛茸茸的正则表达式,例如:
`passwd -S $user` !~ /^\s*Password\s*:\s*locked\s*$/im'
最后的'i'使它不区分大小写(可能不是必需的),'m'允许匹配多行输出[来自passwd -S]。如果没有看到你匹配的确切输出(在你的* nix上),很难确切地说出你需要什么。
例如,在cygwin上,我认为相当于:
`passwd -S $user` !~ /^\s*Account\s+disabled\s+:\s+yes\s*$/im'
答案 3 :(得分:0)
open(F,"<","/etc/shadow") or die "Cannot open shadow file:$!\n";
while(<F>){
chomp;
@s = split /:/;
if ( $s[1] !~ /!/){
print "user: $s[0] not locked \n";
}
}
close(F);
以root身份使用。