Ввод пароля в терминал через c - PullRequest
0 голосов
/ 03 июля 2018

Я искал этот вопрос и мог найти только варианты Python. Если это предварительные извинения.

Я пытаюсь написать скрипт на c, который автоматически настраивает системы, чтобы у меня не было необходимости делать это вручную на кучах компьютеров. Для части скрипта мне нужно ввести пароль.

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Некоторые программы (которые запрашивают пароль) используют 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».

0 голосов
/ 03 июля 2018

Если у вас есть доступ к терминалу, почему бы не использовать bash для этих настроек? В обоих случаях C или bash, если вы обращаетесь к областям с высоким уровнем привилегий, вам потребуется доступ с привилегиями. То, что вы будете искать, будет командой sudo. Он запросит у вас пароль перед запуском и будет запущен следующим образом:

sudo someExecutable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...