Domanda

Qual è il modo migliore per aggiungere un utente/gruppo in Linux utilizzando C++, esiste una libreria a cui posso fare riferimento?Non voglio iniziare a fare cose come:

fopen("/etc/passwd", "a");
 fprintf(tmp, "%s:x:%d:1:%s:/%s/%s:/bin/ksh\n", username, usernumber, commentfield, userdir, username);
 fclose(tmp);

fopen("/etc/shadow", "a");
 fprintf(stmp, "%s:*LK*:::::::\n", username);
 fclose(stmp);

Grazie!

È stato utile?

Soluzione

Ho notato che la maggior parte delle principali utility che aggiungono e modificano gli utenti lo fanno direttamente, spesso in modi diversi.Le funzioni che puoi utilizzare per modificare il file password e i file shadow sono esposti <pwd.h> e dentro <sys/types.h>, E fanno parte di glibc.

fgetpwent, getpwnam, getpw, getpwent_r, putp, setpwent

Possiamo esaminare come busybox (via TinyLogin) lo fa, ad esempio.In busybox/loginutils/adduser.c, inseriscono un utente nel file passwd costruendo la struttura passwd e quindi chiamano putpwent.Per aggiungere la password dell'utente nel file shadow, chiamano semplicemente fprintf e scrivere direttamente la stringa.

Per autenticare gli utenti in modo moderno, c'è Linux-PAM.Ma per quanto riguarda l'aggiunta di utenti, puoi vedere in pam_unix_passwd.c che chiamano unix_update_db(), che richiama varie funzioni libpwdb, che dovresti aggiungere come dipendenza al tuo progetto se lo usi.

Detto questo, sono colpevole di aver scritto un paio di utilità per analizzare i database passwd e shadow e modificarli direttamente.Ha funzionato bene, ma era su un sistema integrato dove potevo controllare strettamente tutto.Non dovevo preoccuparmi di cose come le condizioni di gara con altri programmi che modificavano il passwd db.

Se devi aggiungere un gruppo, lo stesso vale per il file banca dati del gruppo.

Altri suggerimenti

Si potrebbe provare a utilizzare il biblioteca libuser .

Una delle applicazioni che sono distribuiti con libuser è luseradd, un programma che sembra essere un programma di utilità useradd cross-platform. Al suo interno, luseradd utilizza la funzione di lu_user_add libuser creare fisicamente l'utente.

Si veda la cartella docs/html nella distribuzione dei sorgenti per la documentazione.

L'aggiunta di un utente è un po 'troppo alto livello perché vi sia una chiamata di sistema per esso. Per quanto io sappia, non ci sono le librerie ampiamente utilizzati per questa operazione. La cosa migliore sarà probabilmente quella di utilizzare la chiamata system per richiamare il programma useradd con le opzioni appropriate.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top