Как сделать программу, похожую на оболочку, которая позволяет вводить пароль SSH?

В терминале OSX я могу подключиться к серверу с помощью SSH, потому что терминал предлагает сеанс ввода пароля.

$ ssh [email protected]
[email protected]'s password: 

Я хотел сделать свою собственную реализацию терминала, поэтому я

  1. создал псевдотерминал.
  2. вилка
  3. перенаправлен pty slave в стандартный ввод дочернего процесса.
  4. исполняемый баш.

А затем помещает строку ssh [email protected] в мастер pty родительского процесса. Но по программе мне это показали.

$ ssh [email protected]
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,password).

вместо сеанса пароля.

В чем моя проблема и как ее исправить?

P.S. Я знаю, что могу использовать утилиту expect. Это всего лишь пробная версия моего собственного псевдооболочки.

Обновление для дальнейшего использования

Ключом к решению было использование функции forkpty() вместо функции posix_openpt(). Первый выполняет всю тяжелую надоедливую работу и дает мне двунаправленный номер основного файла. Я могу читать и писать в номер файла. И созданное pty устройство отлично работает. Сеанс входа по SSH работает хорошо. В отличие от последнего, все еще нужно много работы, которую я никогда не могу понять, как.

Мне пришлось позаботиться о forkpty последних двух параметрах. Я думал, что это вывод, но на самом деле это ввод. Это было источником всех проблем, и после установки их на все NULL теперь все работает хорошо.


person eonil    schedule 02.04.2013    source источник


Ответы (2)


Уже есть программа, которая делает то, что вы хотите: sshpass

http://sshpass.sourceforge.net/

Поскольку это открытый исходный код, вы можете изучить его исходный код, чтобы узнать, как он работает.

person slim    schedule 02.04.2013

Наконец-то я написал pty устройство: https://github.com/eonil/PseudoTeletypewriter.Swift

Мой старый Q/A описывает еще несколько: nstask/27903173#27903173">Как переключить терминал на новый дочерний процесс процесса, запущенного с помощью NSTask?

person eonil    schedule 12.01.2015