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

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

$ ssh user@server.com
user@server.com's password: 

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

  1. создал псевдо-терминал.
  2. вилка
  3. перенаправил pty-раба в stdin на дочерний процесс.
  4. Exec Bash.

А потом толкает строку ssh user@server.com в pty мастер по родительскому процессу. Но программа показала мне это.

$ ssh user@server.com
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,password).

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

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

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

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

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

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

2 ответа

Решение

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

http://sshpass.sourceforge.net/

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

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

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

Другие вопросы по тегам