2010-06-21 47 views
7

什麼是使用C++在Linux中添加用戶/組的最佳方式是否有我可以調用的庫?我不想開始做這樣的事情: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); 

謝謝!

回答

5

我注意到大多數添加和更改用戶的主要實用程序都是以不同的方式直接執行操作。您可以用來修改passwd和影子文件的功能在<pwd.h><sys/types.h>they're part of glibc中公開。

fgetpwentgetpwnamgetpwgetpwent_rputpwentsetpwent

我們可以看看busybox的(通過TinyLogin)是怎麼做的,作爲一個例子。在busybox/loginutils/adduser.c中,他們通過構建passwd結構將用戶置於passwd文件中,然後致電putpwent。要在影子文件中添加用戶密碼,他們只需調用fprintf並直接寫入字符串。

爲了用現代方式驗證用戶,有Linux-PAM。但就添加用戶而言,您可以在pam_unix_passwd.c中看到他們稱unix_update_db(),它調用libpwdb中的各種函數,如果您使用該函數,則必須將其作爲依賴項添加到項目中。

這就是說,我寫了一對夫婦工具來解析passwd和shadow數據庫並直接修改它們。它運行良好,但是這是在一個嵌入式系統中,我可以嚴格控制一切。我不必擔心與其他程序修改passwd db的競爭條件有關。

如果您需要添加一個組,同樣適用於group database

3

添加一個用戶有點太高級了,因爲有一個系統調用它。據我所知,這也沒有任何廣泛使用的庫。您最好的選擇可能是使用system調用以適當的選項調用useradd程序。

+0

幾件事: *除非你確定你傳遞的東西不會被shell解釋爲特殊字符,否則不要使用system()。 * useradd不是特別便攜的(在某些系統上,您可能無法創建「普通」用戶,例如用戶在LDAP/NIS/AD /等中的用戶 一般而言,對於一次性用戶創建我會使用一個shell腳本。 – 2010-06-21 16:43:00

4

您可以嘗試使用libuser庫。

與libuser一起分發的應用程序之一是luseradd,該程序似乎是一個跨平臺的useradd實用程序。在其核心,luseradd使用libuser的lu_user_add函數來物理創建用戶。

請參閱文檔的源代碼分發中的docs/html文件夾。