2011-11-07 70 views
8

我有一个C++类,用于启动和与外部进程进行通信(有点类似于Qt的QProcess-我们不能使用Qt,因为我们正在开发一个小型嵌入式系统)。它使用pipe和dup2系统调用来建立父进程和子进程之间的链接。问题是 - 它不适用于希望密码的ssh,scp和其他程序。我已经放大了ssh,它似乎打开/ dev/tty,并以某种方式使用它从命令行读取密码。有什么方法可以从我的课程中输入密码,或者检测到应用程序需要输入来自其他源的输入而不是标准输入(根本不必是可移植的)?如何在C++中将密码输入到ssh中?

+10

你不想发送密码。你想要做的就是让ssh在〜/ .ssh目录中读取和使用你的私钥 –

+0

使用公钥认证或者看看askpass和ssh-agent – sehe

+0

看看[sshpass](http://sourceforge.net/projects/sshpass /) – ephemient

回答

7

ssh程序通常会直接从终端读取密码。你需要分配一个伪终端并在这个伪终端内执行ssh来捕获这个I/O。 pty手册页(第7,man 7 pty)是一个很好的介绍。

我想重新说明你通常不想给ssh密码,还有很多更好的认证选项。对于应该并可能在没有用户输入的情况下运行的进程使用公钥认证。

+0

+1为公开密钥建议。其他任何可能会将明文密码放在程序中(坏)。 – jedwards

+0

对于安全漏洞,你可能是正确的,但我只是想让我写的这个库如此灵活。如果他要以适当的方式来完成ssh的话,这将取决于最终用户。 – Zbigh1

2

寻找一些已经做到的程序,例如lftp。

或者与strace这Perl的一行代码来获得你应该做的一个想法:

perl -MNet::OpenSSH -e 'Net::OpenSSH->new(localhost, password => foo)' 

这主要是减少对主进程分配一个伪终端对,分叉和设置的从部分在执行ssh之前将孩子上的pty作为当前tty。