如何使用Linux系统调用在C中更改用户密码?
我正在尝试编写一个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 ……的东西,这并不重要。
您可以尝试使用putpwent
。 正如Jonathan Leffler在评论中所说,如果你想更新影子文件,你需要putpent 。
但是,最简单且可能最便携的方法是通过system(3)
或popen(3)
调用passwd
。
我从Windows和OS X开发的后台开始在Linux上开始编写软件时学到的第一件事就是命令行实用程序被接受,而不是避开。 即使对于可以选择使用C api或命令行实用程序的东西, fork
和exec
通常更聪明,更可靠(除非你不关心检查返回代码是否为0,否则不要打开它!)而不是使用C api。
实际上,调用命令行实用程序与调用C api没有什么不同, 除非您需要在应用程序中剔除每一个性能。 它实际上是一个API,其中函数名称是实用程序名称,参数是命令行参数。
所以回答你的问题:尝试exec
passwd
,它会照顾你所有的问题。