$lastlog_t = "L a32 a256"; #(your machine maybe differ); $LEN = length(pack($lastlog_t,0, '', '')); print "length = $LEN \n"; #### setpwent(); while(@list = getpwent()) { ($login,$home) = @list[0,7]; print "home directory for $login is $home \n"; } endpwent(); #### #!/usr/bin/perl $lastlog_t = "L a32 a256"; #(your machine maybe differ); $LEN = length(pack($lastlog_t,0, '', '')); open(LASTLOG,'/var/log/lastlog') || die "can't open lastlog file: $! \ +n"; open(PASSWD,'/etc/passwd') || die "can't open passwd file: $! \n"; @month=(Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec); while($varrec = ) { ($login,$pass,$uid,$gid,$gcos) = split(/:/,$varrec); $fullname = $gcos; # $fullname = ~ s/^[^,]*--(.*)\(.*/$1/ || $fullname =~ s/,.*//; #try to uncomment code line above, cuz i got weird result if ($fullname =~ /&/) { #u dont want to know $name = $login; substr($name,0,1) = ~ tr/a-z/A-Z/; $fullname = ~ s/&/$name/; } seek(LASTLOG,$uid * $LEN, 0); read(LASTLOG,$lastlog,$LEN); ($time,$line,$host) = unpack($lastlog_t,$lastlog); push(@records, "$time:$login:$uid:$fullname"); } @records = sort numerically @records; foreach $record(@records) { ($time,$login,$uid,$fullname) = split(/:/,$record); if ($time) { ($sec,$min,$hour,$mday,$mon,$year) = localtime($time); $year +=1900; $date = "$mday $month[$mon] $year"; } else { $date = "never"; } write; } sub numerically {$a <=> $b; } format top = Uid Login Full Name Last Login . format STDOUT = @>>>>> @<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @|||||||||||| $uid $login $fullname $date