通过c在终端输入密码

时间:2018-07-03 05:32:42

标签: c terminal

我搜索了这个问题,只能找到python变体。如果这是重复的歉意。

我正在尝试用c编写一个自动设置系统的脚本,这样我就不必在计算机堆上进行手动操作了。对于脚本的一部分,我需要输入密码。

2 个答案:

答案 0 :(得分:0)

如果您可以访问终端,为什么不对这些设置使用bash?在C或bash的两种情况下,如果您要访问高特权级别的区域,则都需要特权访问权限。您想要的东西是sudo命令。它将在运行密码之前提示您输入密码,并且运行如下:

sudo someExecutable

答案 1 :(得分:0)

某些程序(提示输入密码)使用isatty(STDIN_FILENO)调用来确保通过终端输入密码。

在这种情况下,无法使用普通管道将密码发送给程序。

对于那些程序,您可以创建一个伪终端,代替管道使用。示例:

void test(void)
{
    const int fdm = posix_openpt(O_RDWR | O_NOCTTY);
    if (fdm != -1)
    {
        char name[100];
        unlockpt(fdm);
        ptsname_r(fdm, name, sizeof(name));

        const int fds = open(name, O_RDWR | O_NOCTTY);
        if (fds != -1)
        {
            const pid_t child_pid = fork();

            if (child_pid == -1)
            {
                // TODO: Error handling
            }
            else if (child_pid == 0)
            {
                dup2(fds, STDIN_FILENO);
                dup2(fds, STDOUT_FILENO);
                close(fds);
                close(fdm);
                execl("/sbin/program_that_requires_password_from_terminal", "blabla", (char*) NULL);
            }
            else
            {
                const char password[] = "mypassword\n";
                int status;
                close(fds);
                // TODO: wait prompt from the program by reading fdm
                write(fdm, password, strlen(password));
                waitpid(-1, &status, 0);
                close(fdm);
            }
        }
    }
}

通过这种方式,目标程序中的isatty(STDIN_FILENO)返回'true'。