在C代码中使用popen()更改密码

时间:2014-03-04 20:11:23

标签: c linux change-password

我正在尝试使用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')没有成功。

好像“重新输入密码”与“新密码”不同。

我做错了什么?

2 个答案:

答案 0 :(得分:2)

我认为你应该writefileno(fp)而不是简单的fp。如果我理解正确的文档,那就是你的管道结束: http://linux.die.net/man/3/filenohttp://pubs.opengroup.org/onlinepubs/009696699/functions/popen.html

答案 1 :(得分:2)

这个工具适用于我:

的main.c

#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