系统管理工具包: 监视用户的使用情况
2009-11-04 00:00:00 来源:WEB开发网在 Perl 中使用 unpack 函数需要创建适当的 packstring,它用于定义您希望从二进制记录数据(从原始二进制 utmp 文件中读取)中提取的数据类型。
清单 17 显示了一个很简单的 Perl 脚本,该脚本用于对 wtmp 中的数据进行直接转储。
清单 17. 转储 wtmp 中数据的 Perl 脚本
my $packstring = "a8a8a8ssssl";
my $reclength = length(pack($packstring));
my @ut_types = qw(EMPTY RUN_LVL BOOT_TIME OLD_TIME
NEW_TIME INIT_PROCESS LOGIN_PROCESS
USER_PROCESS DEAD_PROCESS ACCOUNTING);
open(D,"</var/log/wtmp") or die "Couldn't open wtmp, $!";
while(sysread(D,my $rec,$reclength))
{
my ($user,$userid,$line,$pid,$type,$eterm,$eexit,$time)
= unpack($packstring,$rec);
print("$user, $userid, $line, $pid, $ut_types[$type], ",
"$eterm, $eexit, ", scalar localtime($time),"\n");
}
close(D) or die "Couldn't close wtmp, $!";
请注意,您必须使用 sysread 来读取数据,因为您读取的是原始二进制包(而不是行)。您所使用的 packstring 将获取用户名、用户 ID、tty 线路、PID、utmp 类型、终端退出代码和时间。
最前面的三个字段是非常重要的,因为其中包含了行、名称和主机信息。在 utmp.h 中,对这些字段的大小进行了合适的定义(请参见清单 18)。
清单 18. utmp.h 中定义的最前面三个字段的大小
更多精彩
赞助商链接