【问题标题】:Entering password into terminal through c通过c将密码输入终端
【发布时间】:2018-07-03 05:32:41
【问题描述】:

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

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

【问题讨论】:

  • 需要密码的不是终端,而是您正在运行的某个程序。有些程序只是读取stdin,但有些程序使用低级终端IO来确保必须手动输入密码。您必须查看每个程序以找到它们使用的方法。
  • 我认为使用现有的单点登录工具会更好。我知道,您不是在要求这样的工具(这将是题外话)。但值得努力搜索。
  • 我实际上是在寻找输入计算机管理员密码而不是程序密码。我也想知道如何检测 bash 何时需要密码
  • bash 不需要密码,但登录过程可能,或sudo 程序(与bash 无关)。什么情况下需要密码?
  • 我的意思是 sudo bash

标签: c terminal


【解决方案1】:

如果您可以访问终端,为什么不使用 bash 进行这些设置?在 C 或 bash 的两个实例中,如果您正在访问高权限级别的区域,您将需要权限访问。你要找的东西是 sudo 命令。它会在运行之前提示您输入密码,并且运行如下:

sudo someExecutable

【讨论】:

【解决方案2】:

一些程序(提示输入密码)使用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'。

【讨论】:

    猜你喜欢
    • 2016-10-29
    • 2021-01-27
    • 2021-01-10
    • 1970-01-01
    • 2012-04-02
    • 2015-07-30
    • 2019-08-15
    • 2021-02-17
    相关资源
    最近更新 更多