Как создать подобную оболочке программу, которая позволяет вводить пароль SSH?
В терминале OSX я могу подключиться к серверу с SSH, потому что терминал предлагает сеанс ввода пароля.
$ ssh user@server.com
user@server.com's password:
Я хотел сделать свою собственную реализацию терминала, поэтому я
- создал псевдо-терминал.
- вилка
- перенаправил pty-раба в stdin на дочерний процесс.
- 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?