2010-02-24 32 views

回答

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讀取用戶的密碼,並找出用戶是否被鎖定。

+0

謝謝你們 - 我想我現在已經做到了。 – paul44 2010-02-24 11:32:25

+0

不客氣! :)請投票贊成有用的答案,並選擇最有幫助的(如果有的話)作爲接受的答案。 – 2010-02-24 16:45:22

0

我不確定你是否在尋找一種命令行方式來做到這一點,下面的代碼假設passwd -S的輸出正好是你如何指定它(可能贏了「T在實際工作),但是這是一個方法:

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' 

凡」我'最後會使其不區分大小寫(這可能不是必需的) ,'m'允許匹配多行輸出[來自passwd -S]。沒有看到您匹配的確切輸出(在您的* nix上),很難確切地說出您需要什麼。

例如,在Cygwin的,我覺得相當的將是這樣:

`passwd -S $user` !~ /^\s*Account\s+disabled\s+:\s+yes\s*$/im' 
2

同爲一個班輪。

sudo perl -F: -lane 'print $F[0] if $F[1]!~/^!/' /etc/shadow 
+1

他要求打印未鎖定的用戶。我自己犯了同樣的錯誤;) – 2010-02-24 10:38:56

+0

謝謝你指出我的錯誤。 – codeholic 2010-02-24 10:40:39

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); 

作爲根使用。

相關問題