如何制作允许SSH密码输入的shell式程序?

时间:2013-04-02 13:28:22

标签: c ssh pty

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

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

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

  1. 创建了伪终端。
  2. 将子进程的pty slave重定向到stdin。
  3. exec bash。
  4. 然后,将字符串ssh user@server.com推送到父进程的pty master。 但通过节目向我展示了这一点。

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

    而不是密码会话。

    我的问题是什么,我该如何解决?

    P.S。我知道我可以使用expect实用程序。这只是一个实现我自己的伪shell应用程序的试验。

    更新以供日后参考

    解决方案的关键是使用forkpty()函数而不是posix_openpt()函数。前者处理所有困难的烦人作品,并给我双向主文件号。我可以读取和写入文件号。并且创建的pty设备完美运行。 SSH登录会话运行良好。相比之下,后者仍然需要很多我无法弄清楚的作品。

    我不得不关心forkpty最后两个参数。我认为它们是输出,但实际上是输入。这是所有问题的根源,在将它们设置为所有NULL之后,它现在运作良好。

2 个答案:

答案 0 :(得分:4)

已经有一个程序能够满足您的需求:sshpass

http://sshpass.sourceforge.net/

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

答案 1 :(得分:1)