文件: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",$count,$whox_hash{$user}{tty}[0] || '(null)',$whox_hash{$user}{ip}[0] || '(null)'; } print "\r"; }
原始'who -x'命令输出界面:
whox.pl执行后界面:
BUG2:
BUG2修复: