|
||||||||||||||||
| [IT] Scoprire dati sugli utenti (come fa Finger) | ||||||||||||||||
|
Scoprire dati sugli utenti (come fa Finger) Un comando onnipresente sui sistemi Linux e Unix, e' "Finger" che si occupa di fornire dati sugli utenti collegati alla macchina su cui viene eseguito o collegati ad un host remoto. Quel che si vuole spiegare e' come il finger reperisca i dati che visualizza, tralasciando il funzionamento nel caso di richieste remote. Le fonti principali di informazione sono i file "/etc/passwd" e "/var/run/utmp". Se non si riuscisse a trovare il file utmp con il percorso indicato, si provi a guardare nel file "/usr/include/path.h" nella costante "_PATH_UTMP". Il formato del file passwd e' semplice da comprendere, mentre quello di utmp no (dati memorizzati in forma binaria). Comunque, per accedere alle informazioni che contengono, generalmente si includono i file "utmp.h" e "pwd.h" che contengono tutte le funzioni e strutture dati necessarie. Prima di passare a vedere delle semplici routine
che ci permettono di reperire informazioni, e' bene sapere che non tutte
le informazioni possibili sono disponibili su tutti i sistemi unix. Ad
esempio, il campo ut_addr_v6
(utmp),
che dovrebbe contenere in Linux l'indirizzo IP dell'host remoto, non e'
presente sui sistemi basati su unix SYS V.
La routine seguente utilizza funzioni e strutture definite in utmp.h per cercare dati sugli utenti.
#include <utmp.h>
...
//Definisco una variabile per contenere i dati degli utenti
struct utmp* Utente = NULL;
//Conto gli utenti trovati: mi serve solo per scopi statistici
int cont=0;
//Inizializzo il file degli utenti alla prima posizione
setutent();
//Ciclo di ricerca degli utenti
while ((Utente=getutent())!=NULL)
{
//Gli utenti sono contrassegnati dal valore 7 (USER_PROCESS). Se non ho un utente,
//allora ricomincio il ciclo per andare avanti nella ricerca degli utenti
//nel file UTMP_FILE, altrimenti stampo i dati trovati.
if (Utente->ut_type!=USER_PROCESS) continue;
//Se l'elemento rappresenta un utente, ne stampo i dati
StampaDatiUtente(Utente);
//Aumenta il numero degli utenti trovati
cont++;
}
Sono state usate due funzioni di utmp.h: "setutent()"
e "getutent()".
L'orario di collegamento, come si puo' vedere
dalla tabella, e' espresso sotto forma di struttura. Un campo di tale struttura
e' il tempo misurato in secondi: e' necessario convertire il valore numerico
in una stringa leggibile.
#include <time.h>
...
char* ConvertiTempo(time_t t)
{
return ctime(&t);
}
...
printf("%s",ConvertiTempo(Utente->ut_tv.tv_sec));
...
La funzione ctime, definita in time.h, e' quella che si occupa effettivamente della conversione. Rimane da analizzare l'utilizzo di "passwd.h". Si dia uno sguardo alla seguente routine.
#include <pwd.h>
...
//Variabile contenente le informazioni tratte da /etc/passwd
struct passwd* PwUtente = NULL;
//Inizializzazione per la scansione del file /etc/passwd
setpwent();
//Cerco, se esiste, l'utente trovato con le funzioni di utmp (potrei
//usare anche un'altra variabile char* qualsiasi)
if ((PwUtente=getpwnam(Utente->ut_user))!=NULL)
{
//Stampa di: nome reale; home directory; shell
printf("%s;%s;%s",PwUtente->pw_gecos,PwUtente->pw_dir,PwUtente->pw_shell
}
endpwent();
...
I campi pw_gecos,
pw_dir
e pw_shel,
contengono rispettivamente informazioni sul nome reale dell'utente, sulla
home directory, sulla shell che viene avviata a seguito del login.
Per ulteriori informazioni ed approfondimenti
sulle altre funzioni disponibili, consiglio di guardare direttamente i
file "utmp.h" e "pwd.h".
|
||||||||||||||||
(c) 1999-2006
|