如何在Perl中运行passwd -S并捕获其输出?

时间:2010-02-24 09:55:39

标签: perl

如果用户未锁定,我想扫描 passwd 文件并仅打印行。也就是说,passwd -S $user不会返回“密码:已锁定”。我可以在ksh中轻松完成。在Perl中执行此操作的最佳方法是什么?

4 个答案:

答案 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身份使用。