文件:whox.pl;
功能:列出谁在系统上,如有同一用户多次登录分组显示;
说明:列用户登录次数,使用的虚拟终端号及对应的IP;
优点:相对于”who -x”显示出的信息更加直观。
#!/usr/bin/perl -w
use 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:ip
if (/(^\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修复: