如何使用Linux系统调用在C中更改用户密码?

时间:2012-04-02 15:10:23

标签: c linux passwords

我正在尝试编写一个C程序来使用Linux系统调用来更改用户密码。我尝试使用/etc/passwd/etc/shadow文件,但由于密码已加密,我遇到了问题,您可以帮我解决这个问题吗?

void main(int argc,char ** argv){

uid_t uid;

struct passwd *pw;

uid = getuid();

if (argc > 1)
    pw = getpwnam(argv[1]);
else
    pw = getpwuid(uid);
//system("passwd");
//printf("%i",execl("/usr/bin/passwd","passwd",pw->pw_name)); //here I tried to use execl but it returns error

}

我使用系统(“passwd”),但我认为我的老师不会接受。在其余部分我只是想了解getpw ......的东西,这并不重要。

2 个答案:

答案 0 :(得分:3)

您可以尝试使用putpwent。正如Jonathan Leffler在评论中所说,如果你想更新影子文件,你需要putspent

但最简单且可能最便携的方法是通过passwdsystem(3)拨打popen(3)

答案 1 :(得分:1)

当我从Windows和OS X开发的后台开始在Linux上开始编写软件时,我学到的第一件事就是命令行实用程序被接受,而不是避开。即使对于可以选择使用C api或命令行实用程序的东西,forkexec(除非您不关心)popen也不要exec更加智能和可靠检查返回码是否为0!)而不是使用C api。

实际上,调用命令行实用程序与调用C api 没有什么不同,除非您需要在应用程序中完成最后一点性能。它实际上是一个API,其中函数名称是实用程序名称,参数是命令行参数。

因此,在回答您的问题时:尝试passwd {{1}},它会解决您的所有问题。

相关问题