如何在C++中将密码传递给ssh?

8
我有一个用于启动和与外部进程通信的C++类(类似于Qt的QProcess - 我们无法在小型嵌入式系统上使用Qt)。它使用管道和dup2系统调用来建立父子进程之间的链接。问题是 - 它不能与ssh、scp和其他需要密码的程序一起工作。我已经对ssh进行了strace,看起来它打开了/dev/tty,并以某种方式从命令行读取密码。是否有办法从我的类中输入密码或检测应用程序是否期望从stdin以外的其他来源接收输入(不必具备可移植性)?

10
你不想发送密码,你要做的是让ssh读取并使用你在~/.ssh目录下的私钥。 - Martin York
请使用公钥认证,或查看askpass和ssh-agent。 - sehe
请查看sshpass - ephemient
2个回答

7

通常,ssh程序直接从终端读取密码是一种常见的做法。您需要分配一个伪终端,并在该伪终端内执行ssh命令以捕获此输入/输出。pty手册(第7章,man 7 pty)是一个很好的介绍。

我想再次强调,您通常不希望将密码提供给ssh,因为有许多更好的身份验证选项。对于应该和可能在没有用户输入的情况下运行的进程,请使用公钥身份验证。


+1 针对公钥建议。其他任何方式都可能将明文密码放入程序中(不好)。 - jedwards
你关于安全漏洞的看法可能是正确的,但我只是希望我正在编写的这个库尽可能灵活。最终用户是否以正确的方式执行ssh操作将取决于他自己。 - Zbigh1

2

寻找已经实现该功能的程序,例如lftp。

或者使用strace跟踪这个Perl单行命令,以获得你应该做什么的想法:

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

这主要涉及在主进程上分配一个伪终端对,然后在子进程中将pty的从部分设置为当前tty并执行ssh。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接