在 OSX 终端上,我可以使用 SSH 连接到服务器,因为终端提供密码输入会话。
$ ssh user@server.com
user@server.com's password:
我想做自己的终端实现,所以我
- 创建了伪终端。
- 叉
- 将 pty slave 重定向到子进程的标准输入。
- 执行 bash。
然后,将字符串推ssh user@server.com
送到父进程的 pty master 中。但是通过程序向我展示了这一点。
$ ssh user@server.com
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,password).
而不是密码会话。
我的问题是什么,我该如何解决?
PS我知道我可以使用expect
实用程序。这只是实现我自己的伪 shell 应用程序的试验。
更新供以后参考
解决方案的关键是使用forkpty()
函数而不是posix_openpt()
函数。前者处理所有烦人的工作,并给我双向主文件编号。我可以读取和写入文件号。并且创建的 pty 设备完美运行。SSH 登录会话运行良好。相比之下,后者仍然需要很多我永远无法弄清楚的作品。
我必须关心forkpty
最后两个参数。我以为它们是输出,但实际上是输入。那是所有问题的根源,在将它们设置为 all 之后NULL
,它现在运行良好。