3

在 OSX 终端上,我可以使用 SSH 连接到服务器,因为终端提供密码输入会话。

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

我想做自己的终端实现,所以我

  1. 创建了伪终端。
  2. 将 pty slave 重定向到子进程的标准输入。
  3. 执行 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,它现在运行良好。

4

2 回答 2

4

已经有一个程序可以满足您的需求:sshpass

http://sshpass.sourceforge.net/

由于它是开源的,因此您可以检查其源代码以了解其工作原理。

于 2013-04-02T13:32:20.437 回答
1

我终于写了pty设备:https ://github.com/eonil/PseudoTeletypewriter.Swift

我的旧 Q/A 描述了更多内容:如何将终端切换到使用 NSTask 启动的进程的新子进程?

于 2015-01-12T14:10:45.847 回答