我正在尝试使用popen
更改C代码中的密码。
在我所拥有的Linux上,在命令提示符下,passwd(busybox)工作正常
# passwd simon
Changing password for simon
New password:
Retype password:
Password for simon changed by root
我正在尝试在C中执行此操作(以root身份运行):
int len=strlen(s_password); char line[1024];
sprintf(line,"passwd %s", s_username);
FILE *fp= popen(line,"w");
int i;
for(i=0; i<len;++i)fputc(s_password[i], fp);
for(i=0; i<len;++i)fputc(s_password[i], fp);
fputc('\n', fp);
//fprintf(fp,"%s\n",s_password);
//fprintf(fp,"%s",s_password);
pclose(fp);
我也尝试了fprintf
(评论)但没有成功。似乎第一个条目正在通过而不是第二个条目。当我执行代码时,我得到:
Changing password for simon
New password:
Retype password:
passwd: password for simon is unchanged
我尝试了所有可能的场景('\ n'省略'\ n')没有成功。
好像“重新输入密码”与“新密码”不同。
我做错了什么?
答案 0 :(得分:2)
我认为你应该write
到fileno(fp)
而不是简单的fp。如果我理解正确的文档,那就是你的管道结束:
http://linux.die.net/man/3/fileno和
http://pubs.opengroup.org/onlinepubs/009696699/functions/popen.html
答案 1 :(得分:2)
这个工具适用于我:
#include <stdio.h>
#include <sys/wait.h>
int main(int argc, char **argv)
{
if (argc < 3) {
printf("Usage: %s username password\n", argv[0]);
return 1;
}
char cmd[32];
sprintf(cmd, " passwd %s", argv[1]);
FILE *fp= popen(cmd, "w");
fprintf(fp, "%s\n", argv[2]);
fprintf(fp, "%s\n", argv[2]);
printf("Return value: %i\n", WEXITSTATUS(pclose(fp)));
return 0;
}
gcc -Wall -Wpedantic -Wextra main.c