Предоставление логина и пароля через c ++, как ожидается сценарий в Unix / Linux - PullRequest
1 голос
/ 18 декабря 2010

Задача ::

Я хочу выполнить удаленный вход на сервер по SSH, выполнить некоторые команды и получить выходные данные исполняемых команд.

Решение ::

Я добился того же, используя свой «ожидаемый скрипт» в моем perl-скрипте, а затем выполняю его. Но это слишком медленно, требуется около 10 секунд, чтобы получить PID удаленного процесса, а затем проверить его память и использование процессора.

Генерация rsa ID с использованием ssh-keygen - вариант, но двунаправленная связь все еще помнит проблему.

Требование ::

Можно ли добиться того же в C / C ++ без использования каких-либо дополнительных библиотек, использующих pipe или FIFO?

Popen (), кажется, вариант, но он является только однонаправленным (двунаправленный существует только для * BSD) и использует FIFO, я не знаю, как заставить вводить и выводить команды ssh к FIFO, а также для команды SSH требуется вход в систему и пароль всегда из Терминала.

Заранее спасибо.

1 Ответ

1 голос
/ 18 декабря 2010

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

В любом случае, я бы порекомендовал использовать socketpair вместо каналов. Они разрешают двунаправленную связь, в то время как каналы являются однонаправленными (поэтому вам нужны два канала, то есть четыре файловых дескриптора).

enum { FROMCHILD = 0, TOCHILD = 1 };
int fd[2];
socketpair(AF_UNIX, SOCK_STREAM, 0, fd); // check for errors

switch (fork()) {
  case -1:
    // handle error
  case 0:
    // child
    dup2(fd[TOCHILD],   0);
    dup2(fd[FROMCHILD], 1);
    // try to exec
    _exit(1);
  default:
    // parent: we may read from fd[FROMCHILD] and write to fd[TOCHILD]
}

Кроме того, убедитесь, что вы правильно указали в кавычках, если вам нужно создать / разобрать команду SSH в буфере argv. Проверьте quote.c из Git , если вам нужен пример кода (или обсуждение вопросов).

...