檔案:whox.pl;
功能:列出誰在系統上,如有同一使用者多次登入分組顯示;
說明:列使用者登入次數,使用的虛擬終端號及對應的IP;
優點:相對於”who -x”顯示出的資訊更加直觀。
#!/usr/bin/perl -wuse strict;#################################################### 檔案:whox.pl# 功能:列出誰在系統上,如有同一使用者多次登入分組顯示# 說明:列使用者登入次數,使用的虛擬終端號及對應的IP# 優點:相對於"who -x"顯示出的資訊更加直觀# 版本:v0.11# 時間:2012-5-11 12:24# 修改:2012-6-26 15:07# BUG1:修複無法列出通過控制台登入的使用者;# BUG2:修複printf輸出tty,ip變數是undef值出錯;# 作者:半點鐘閑# 測試平台:# SCO_SV scosysv 3.2 5.0.6 i386## 資料結構說明:# %whox_hash = {存放'who -x'提取感興趣的資訊;# user => {以實際提取的用記名稱做鍵;#tty => [],#ip => [],#count => 1,同一使用者在系統上的數量;# }, # }###################################################open (WHOX, "who -x |") or die "Can't open wordcount:$!";my %whox_hash;while(<WHOX>){##############################################BUG1:/(^\w+)\s+(\w+)\s.*\s+((?:\d+\.)+\d+)/#時間:2012-5-14 19:46#說明:控制台登入的使用者沒有IP項導致匹配失敗; ##############################################捕獲說明:$1:使用者名稱;$2:虛擬終端號;$3:ipif (/(^\w+)\s+(\w+)\s.*(?: $|\s+((?:\d+\.)+\d+))/) {if (exists $whox_hash{$1}) {push @{$whox_hash{$1}{tty}},$2;push @{$whox_hash{$1}{ip}},$3;$whox_hash{$1}{count}++;} else {$whox_hash{$1} = {tty=>[$2],ip=>[$3],count=>1,};}}}close WHOX;#格式化輸出foreach my $user (keys %whox_hash) {my $count = $whox_hash{$user}{count};#同一使用者多次登入系統中分組顯示詳細資料if ($count > 1) {printf "%-8s%-8s", $user,$count;my $j = length $user;my $k = length $count;for (my $i = 0; $i < $count; $i++) {#######################################BUG2:$whox_hash{$user}{tty}[$i]等#說明:printf輸出tty,ip變數是undef值出錯#時間:2012-6-26 15:07 ######################################printf "%-10s%-20s\n",$whox_hash{$user}{tty}[$i] || '(null)', $whox_hash{$user}{ip}[$i] || '(null)';printf "%-8s%-8s", " " x ($j), " " x ($k);}} else {printf "%-8s%-8s%-10s%-20s\n", $user, $count,$whox_hash{$user}{tty}[0] || '(null)',$whox_hash{$user}{ip}[0] || '(null)';}print "\r";}
原始'who -x'命令輸出介面:
whox.pl執行後介面:
BUG2:
BUG2修複: