查找Unix用户最后登录时间的perl脚本

十二月 1st, 2011 | 124 次阅读
Tags: perl AIX Posted in 技术杂项 :-)说点什么吧

      有时候,出于安全考虑,Unix的系统管理员会需要查找出N台Unix服务器上各个用户的最后登录时间。

      可以通过脚本在各台主机上运行lastlog命令收集信息,也可以从lastlog文件入手,通过对lastlog文件的分析来获取相关信息。

     我之前曾经遇到过一个case,要在短时间内获取37个AIX操作系统上的所有非系统用户的最后登录时间,我采取了通过对lastlog文件进行分析的手段。写了一个perl脚本做自动时间转换(由Unix Timestamp转为普通时间格式),并输出为CSV文件。

      将所有AIX系统上的lastlog文件(/etc/security/lastlog)放到一个目录下,之后用这个目录的路径作为参数传入到perl脚本中,脚本会输出每一台主机的所有非系统用户的最后一次登录信息,并以CSV格式保存在执行路径中。

完整代码如下:

01 #!/usr/bin/perl
02 use strict;
03 use Time::Local;
04
05 my $logname;
06 my $sourcedir;
07 my $username;
08 my $year;
09 my $day;
10 my $month;
11 my $min;
12 my $hour;
13
14 if(defined $ARGV[0]){  
15    $sourcedir = $ARGV[0];
16 }else{
17   die "Pls input the dir of raw-date!\n";
18 }
19
20 if(! opendir DIR, $sourcedir){
21    die "Cannot access the dir of raw-date: $!";
22 }
23
24 my @dir = readdir DIR;
25
26 for $logname(@dir){
27
28 next if($logname=~/\./);
29
30 print("Analsing the data in $sourcedir/$logname\n");
31
32 if(! open LOG, "./$sourcedir/$logname" ){
33    die "Cannot open the lastlog \"$logname\": $!"
34 }
35
36 if(! open RESULT, ">".$logname.".csv"){
37   die "Cannot creat the output log: $!"
38 }
39
40 print RESULT "User,Data,Time\n";
41
42 while(my $line = <LOG>){
43      chomp($line);
44     
45      if($line =~/^(.*):/){
46                 $username = $1;
47      }
48      if($line =~/time_last_login(.*)=(.*)$/){
49             my($sec,$min,$hour,$day,$month,$year) = (localtime($2))[0,1,2,3,4,5,6];
50             my $date= ($year-100)."/".$month."/".$day;
51           print RESULT $username.",".$date.",".$hour.":".$min."\n";
52      }
53 }
54
55 close RESULT;
56 close LOG;
57 }
58
59 closedir DIR;

Relate Posts:// 相关文章

«Low Value Lifestyle

我要留言

6+10=