Perl列出谁在系统上

文件: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修复:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值