2010-11-10 7 views
10

chiunque può dirmi come posso creare un elenco di utenti che hanno effettuato l'accesso ieri o prima ma non hanno ancora effettuato il logout. senza ripetere lo stesso utente nell'elenco.In UNIX, come trovare utenti che hanno effettuato l'accesso ieri o prima

+1

Questo dovrebbe essere posta nelle "colpa server" o "Super Utente" ... non proprio una questione di programmazione –

+3

no questo è unix programmazione della shell di comando. –

risposta

12
last | fgrep "still logged in" | cut -d" " -f1 | uniq -u 
+0

Ciao, grazie mille per la rapida risposta. Cancella le cose ora. ty. –

+0

probabilmente ha bisogno di un 'sort' prima di' uniq' (o 'sort -u') – knittl

+0

corretto, l'ho aggiunto. – AndreKR

0

È possibile farlo a livello di codice, ad es.

In Python:

from pyutmp import UtmpFile 
import time 
import datetime 

for utmp in UtmpFile(): 
    # utmp is a Utmp object 
    if utmp.ut_user_process: 
     duration=(time.time()-utmp.ut_time) 
     if duration > (24*60*60): 
      if not utmp.ut_user in users: 
        users.append(utmp.ut_user) 
        print '%s logged in at %s session duration: %d:%d:%d [%s] on tty %s from %s' % (utmp.ut_user, time.ctime(utmp.ut_time), (duration/3600), ((duration%3600)/60), (duration%60), datetime.timedelta(seconds=duration), utmp.ut_line, utmp.ut_host) 

In Perl:

#! /usr/bin/perl -w 

use lib './blib/lib', './blib/arch'; 
use Getopt::Std; 
use User::Utmp qw(:constants); 
use Socket; 
use strict; 

my @utmp; 
my %ut_type = (BOOT_TIME()  => "BOOT_TIME", 
      DEAD_PROCESS() => "DEAD_PROCESS", 
      EMPTY()   => "EMPTY", 
      INIT_PROCESS() => "INIT_PROCESS", 
      LOGIN_PROCESS() => "LOGIN_PROCESS", 
      NEW_TIME()  => "NEW_TIME", 
      OLD_TIME()  => "OLD_TIME", 
      RUN_LVL()  => "RUN_LVL", 
      USER_PROCESS() => "USER_PROCESS"); 
my ($user,$duration,$host,$hostAddr,$hostName,$start,$startX,$startXms,$line,$pid,%users); 

    if (User::Utmp::HAS_UTMPX()) { 
     @utmp = User::Utmp::getutx(); 
    } else { 
     @utmp = User::Utmp::getut(); 
    } 

    print "\nActive Users - loged in for more than a day\n"; 

    foreach my $entry (@utmp) 
    { 
    unless ($entry->{"ut_type"} != USER_PROCESS || $users{$entry->{"ut_user"}}) { 
     $user   = $entry->{"ut_user"}; 
     $host   = $entry->{"ut_host"}; 
     $hostAddr  = $entry->{"ut_addr"}; 
     $start   = $entry->{"ut_time"}; 
     $startX   = $entry->{"ut_tv"}; 
     $startXms  = $entry->{tv_usec}; 
     $line   = $entry->{"ut_line"}; 
     $pid   = $entry->{"ut_pid"}; 
     $duration  = time - $start; 

     next if ($duration < (24*60*60)); 
     $users{$user} = $user; 

     if ($hostAddr) { 
      $hostName  = gethostbyaddr($hostAddr, AF_INET) ; 
      $hostName .= " (" ; 
      $hostName .= join(".", unpack("C4", $hostAddr)); 
      $hostName .= ")"; 
     } else { 
      $hostName=""; 
     } 

     printf "User: %s, has been logged in since: %s, duration %d:%d:%d [%d days %d hours %d mins %d secs], on %s (PID: %s), from %s [%s]\n", $user, scalar(localtime($start)), $duration/3600, ($duration%3600)/60, $duration%60, ($duration/(3600*24)), $duration/3600, ($duration%3600)/60, $duration%60, $line, $pid, $host, $hostName; 
    } 
    } 
    print "\n\n"; 
Problemi correlati