Определить вывод в tty - PullRequest
       114

Определить вывод в tty

0 голосов
/ 15 апреля 2020

Я делаю программу для автоматического ввода пароля при попытке s sh. Идея заключается в том, что я буду запускать свой исполняемый файл type_pass в фоновом режиме, а затем запускаю процесс s sh. Что-то вроде

$ type_pass & ssh user@host.com

В настоящее время это работает, поскольку я сам дал небольшую задержку (5 секунд) в приложении type_pass.

type_pass выглядит примерно так:

void typeout(int tofd, char* txt, int usecs = 100000) {
  int len = strlen(txt);
  for(int ii = 0; ii < len; ++ii) {
    usleep(usecs);
    int ioctlerr = ioctl(tofd, TIOCSTI, &txt[ii]);
    int err = errno;
  }
}

int main() {
  sleep(10);
  typeout(1, "asdas\n");
}

Мой вопрос: как я могу интеллектуально дождаться запроса пароля от сервера, а затем начать рассылать ключи для пароля?

1 Ответ

0 голосов
/ 15 апреля 2020

Вот ожидаемый сценарий, который я использую для этой цели:

#!/usr/bin/expect

send_user "password: "
set old_timeout $timeout
set timeout -1 
expect_user -re "(.*)\n"
send_user "\n"
set timeout $old_timeout
set password "$expect_out(1,string)\r"

spawn /bin/bash

interact {

-o -nobuffer "assword: "  {
        send $password
}

}

Вышеприведенная программа запрашивает пароль у конечного пользователя, а затем сохраняет его в переменной пароля. Таким образом, пароль никогда не записывается в файл, но ожидается, что будет отображен вывод на терминал. Существует код, который можно добавить, чтобы отключить эхо, но я его не знаю случайно.

Ожидайте, затем запускает интерактивную оболочку bash.

С этого момента ожидайте отзывов весь вывод на терминал. Если выводится строка, содержащая «assword:», ожидаемый выводит сохраненную переменную пароля.

Кстати, я не фанат ожиданий, но я нахожу эту программу полезной во многих случаях, включая s sh.

Я также нашел sshpass полезным для вашей конкретной проблемы. Я также использовал ansible для аналогичной работы - но у вас здесь достаточно, чтобы решить вашу проблему.

...