Как я могу передать пароль к SSH в C ++? - PullRequest
8 голосов
/ 07 ноября 2011

У меня есть класс C ++, используемый для запуска и взаимодействия с внешними процессами (несколько похожий на QProcess Qt - мы не можем использовать Qt, поскольку работаем над небольшой встроенной системой).Он использует системные вызовы pipe и dup2 для установления связи между родительским и дочерним процессами.Проблема в том, что он не работает с ssh, scp и другими программами, ожидающими пароль.Я связал ssh, и кажется, что он открывает / dev / tty и каким-то образом использует его для чтения пароля из командной строки.Есть ли способ ввести пароль из моего класса или обнаружить, что приложение ожидает ввода от другого источника, кроме stdin (не обязательно должен быть переносимым)?

Ответы [ 2 ]

7 голосов
/ 07 ноября 2011

Обычная практика для программ ssh - читать пароли непосредственно с терминалов. Вам нужно выделить псевдотерминал и выполнить ssh внутри этого псевдотерминала, чтобы перехватить этот ввод / вывод. Справочная страница pty (раздел 7, man 7 pty) - хорошее введение.

Я хотел бы еще раз заявить, что вы обычно не хотите давать пароли для ssh, есть много лучших вариантов аутентификации. Используйте аутентификацию с открытым ключом для процессов, которые должны и могут выполняться без ввода данных пользователем.

2 голосов
/ 07 ноября 2011

Найдите программу, которая уже делает это, например, lftp.

Или проложите эту однострочную строку Perl, чтобы получить представление о том, что вы должны делать:

perl -MNet::OpenSSH -e 'Net::OpenSSH->new(localhost, password => foo)'

В основном этосводится к выделению псевдо-пары tty в главном процессе, разветвлению и установке подчиненной части pty дочернего элемента в качестве текущего tty перед выполнением ssh.

...