esoni
05-05-2010, 13:06
CIAO devo fare un esercizio per la mia università,
aprire il file /etc/passwd . Si tratta di un file di testo, in cui ogni riga contiene le informazioni di un utente, e i campi all'interno di una riga sono separati da ':'. Per esempio, la riga
operator:x:37:12:Operator:/var:/bin/sh
ha il seguente significato:
* operator è il nome di login dell'utente;(stringa)
* x rappresenta il campo password (sui sistemi del Centro di Calcolo sono in uso le shadow password, per cui la password non è visibile; (stringa ,se non visibile questo campo contiene x)
* 37 è l'ID numerico dell'utente;(int)
* 12 è l'ID numerico del gruppo a cui appartiene l'utente (a volte i due valori coincidono);(int)
* Operator è il nome in chiaro dell'utente;(stringa)
* /var è l'home directory dell'utente;(stringa
* /bin/sh è la shell di login (e di default) dell'utente. (stringa)
operator:x:37:12:Operator:/var:/bin/sh
Sui sistemi UNIX, le password degli utenti sono memorizzate nel file /etc/passwd.
Si scriva un programma C che legga il file /etc/passwd, spezzando opportunamente i campi, e stampi in output i nomi in chiaro (quinto campo) di tutti gli utenti che hanno /bin/false come shell di default (ultimo campo), indicando che questi utenti non possono in nessun caso connettersi al sistema (si tratta di utenti "virtuali").
È possibile affrontare l'esercizio in (almeno) due modi:
1. leggendo le righe del file con fgets(), e usando poi dei puntatori a carattere all'interno della stringa per identificare i campi, oppure
2. usando la funzione fscanf() con le specifiche di formato %[^...] e %* (si veda il manuale: man fscanf) per spezzare automaticamente le righe al momento della lettura e assegnare solo i campi di interesse.
-------------------------------------------------------------------------------------------------------------------------------------
SONO INTERESSATO ALLA VERSIONE CON FSCANF!!!
la mia difficoltà sta inanzitutto nello spezzare i campi di ogni riga e salvare il loro contenuto.
avevo pensato una cosa del genere
while(scan!=EOF)
{
scan=fscanf(stream, "%s\t%s\t%d\t%d\t%s\%s\t%s", sutente,x,&utente,&gruppo,operator,home,shell);
}
ma la soluzione è errata quindi vorrei sapere come far andare ogni volta ogni campo nella propria variabile grazie
aprire il file /etc/passwd . Si tratta di un file di testo, in cui ogni riga contiene le informazioni di un utente, e i campi all'interno di una riga sono separati da ':'. Per esempio, la riga
operator:x:37:12:Operator:/var:/bin/sh
ha il seguente significato:
* operator è il nome di login dell'utente;(stringa)
* x rappresenta il campo password (sui sistemi del Centro di Calcolo sono in uso le shadow password, per cui la password non è visibile; (stringa ,se non visibile questo campo contiene x)
* 37 è l'ID numerico dell'utente;(int)
* 12 è l'ID numerico del gruppo a cui appartiene l'utente (a volte i due valori coincidono);(int)
* Operator è il nome in chiaro dell'utente;(stringa)
* /var è l'home directory dell'utente;(stringa
* /bin/sh è la shell di login (e di default) dell'utente. (stringa)
operator:x:37:12:Operator:/var:/bin/sh
Sui sistemi UNIX, le password degli utenti sono memorizzate nel file /etc/passwd.
Si scriva un programma C che legga il file /etc/passwd, spezzando opportunamente i campi, e stampi in output i nomi in chiaro (quinto campo) di tutti gli utenti che hanno /bin/false come shell di default (ultimo campo), indicando che questi utenti non possono in nessun caso connettersi al sistema (si tratta di utenti "virtuali").
È possibile affrontare l'esercizio in (almeno) due modi:
1. leggendo le righe del file con fgets(), e usando poi dei puntatori a carattere all'interno della stringa per identificare i campi, oppure
2. usando la funzione fscanf() con le specifiche di formato %[^...] e %* (si veda il manuale: man fscanf) per spezzare automaticamente le righe al momento della lettura e assegnare solo i campi di interesse.
-------------------------------------------------------------------------------------------------------------------------------------
SONO INTERESSATO ALLA VERSIONE CON FSCANF!!!
la mia difficoltà sta inanzitutto nello spezzare i campi di ogni riga e salvare il loro contenuto.
avevo pensato una cosa del genere
while(scan!=EOF)
{
scan=fscanf(stream, "%s\t%s\t%d\t%d\t%s\%s\t%s", sutente,x,&utente,&gruppo,operator,home,shell);
}
ma la soluzione è errata quindi vorrei sapere come far andare ogni volta ogni campo nella propria variabile grazie