2010-06-21 4 views
7

Quel est le meilleur moyen d'ajouter un utilisateur/groupe dans linux en utilisant C++, y at-il une bibliothèque sur laquelle je peux faire appel? Je ne veux pas commencer à faire des choses comme:C++ add linux user

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); 

Merci!

Répondre

5

J'ai remarqué que la plupart des principaux utilitaires qui ajoutent et changent des utilisateurs le font directement, souvent de différentes manières. Les fonctions que vous pouvez utiliser pour modifier les fichiers passwd et les fichiers fantômes sont exposées dans <pwd.h> et dans <sys/types.h> et they're part of glibc.

fgetpwent, getpwnam, getpw, getpwent_r, putpwent, setpwent

Nous pouvons examiner comment busybox (via TinyLogin) le fait, à titre d'exemple. Dans busybox/loginutils/adduser.c, ils placent un utilisateur dans le fichier passwd en créant la structure passwd, puis appellent le putpwent. Pour ajouter le mot de passe de l'utilisateur dans le fichier shadow, il suffit d'appeler fprintf et d'écrire la chaîne directement.

Pour authentifier les utilisateurs de manière moderne, il y a Linux-PAM. Mais en ce qui concerne l'ajout d'utilisateurs, vous pouvez voir dans pam_unix_passwd.c qu'ils appellent unix_update_db(), qui appelle diverses fonctions dans libpwdb, que vous devrez ajouter en tant que dépendance à votre projet si vous l'utilisez. Cela étant dit, je suis coupable d'avoir écrit quelques utilitaires pour analyser les bases de données passwd et shadow et les modifier directement. Ça a bien fonctionné, mais c'était sur un système embarqué où je pouvais tout contrôler. Je n'avais pas à m'inquiéter de choses comme les conditions de course avec d'autres programmes modifiant le db passwd.

Si vous devez ajouter un groupe, il en va de même pour le group database.

3

L'ajout d'un utilisateur est un peu trop haut pour qu'il y ait un appel système. Pour autant que je sache, il n'y a pas de bibliothèques largement utilisées pour cela non plus. Votre meilleur pari sera probablement d'utiliser l'appel system pour appeler le programme useradd avec les options appropriées.

+0

Peu de choses: * N'utilisez pas system() à moins d'être sûr que les éléments que vous passez ne seront pas interprétés comme des caractères spéciaux par le shell. * useradd n'est pas particulièrement portable (et sur certains systèmes, il se peut que vous ne puissiez pas créer un utilisateur "normal", par exemple un utilisateur LDAP/NIS/AD/etc .. En général, pour un utilisateur unique Création J'utiliserais un script shell. –

4

Vous pouvez essayer d'utiliser la bibliothèque libuser.

L'une des applications distribuées avec libuser est luseradd, un programme qui semble être un utilitaire multiplate-forme useradd. À la base, luseradd utilise la fonction lu_user_add de libuser pour créer physiquement l'utilisateur.

Voir le dossier docs/html dans la distribution source pour la documentation.