9

使用 C++ 在 linux 中添加用户/组的最佳方法是什么?有我可以调用的库吗?我不想开始做这样的事情:

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

谢谢!

4

3 回答 3

7

我注意到大多数添加和更改用户的主要实用程序都是直接这样做的,而且通常以不同的方式。可用于修改passwd和 shadow 文件的函数在<pwd.h>和 中公开<sys/types.h>它们是 glibc 的一部分

fgetpwent , getpwnam , getpw , getpwent_r , putpwent , setpwent

作为示例,我们可以研究一下busybox(通过TinyLogin )是如何做到的。其中busybox/loginutils/adduser.c,他们通过构建 passwd 结构将用户放入 passwd 文件中,然后调用putpwent. 为了在影子文件中添加用户的密码,他们只需直接调用fprintf和写入字符串。

为了以现代方式对用户进行身份验证,有Linux-PAM。但就添加用户而言,您可以在pam_unix_passwd.c中看到他们调用unix_update_db() ,它调用libpwdb中的各种函数,如果您使用它,您必须将其添加为项目的依赖项。

话虽如此,我编写了几个实用程序来解析 passwd 和 shadow 数据库并直接修改它们,这让我感到内疚。它工作得很好,但这是在一个嵌入式系统上,我可以严格控制一切。我不必担心其他程序修改 passwd 数据库的竞争条件之类的事情。

如果您需要添加一个组,组数据库也是如此。

于 2010-06-21T17:48:02.503 回答
5

您可以尝试使用libuser库。

与 libuser 一起分发的应用程序之一是luseradd,一个看起来是跨平台useradd实用程序的程序。其核心是luseradd使用 libuser 的lu_user_add函数来物理创建用户。

请参阅docs/html源代码分发中的文件夹以获取文档。

于 2010-06-21T16:42:53.223 回答
3

添加用户有点太高级了,无法对其进行系统调用。据我所知,也没有任何广泛使用的库。您最好的选择可能是使用呼叫以适当system的选项调用程序。useradd

于 2010-06-21T16:34:58.157 回答