我有一个用于启动和与外部进程通信的C++类(类似于Qt的QProcess - 我们无法在小型嵌入式系统上使用Qt)。它使用管道和dup2系统调用来建立父子进程之间的链接。问题是 - 它不能与ssh、scp和其他需要密码的程序一起工作。我已经对ssh进行了strace,看起来它打开了/dev/tty,并以某种方式从命令行读取密码。是否有办法从我的类中输入密码或检测应用程序是否期望从stdin以外的其他来源接收输入(不必具备可移植性)?
通常,ssh程序直接从终端读取密码是一种常见的做法。您需要分配一个伪终端,并在该伪终端内执行ssh命令以捕获此输入/输出。pty手册(第7章,man 7 pty
)是一个很好的介绍。
我想再次强调,您通常不希望将密码提供给ssh,因为有许多更好的身份验证选项。对于应该和可能在没有用户输入的情况下运行的进程,请使用公钥身份验证。
寻找已经实现该功能的程序,例如lftp。
或者使用strace跟踪这个Perl单行命令,以获得你应该做什么的想法:
perl -MNet::OpenSSH -e 'Net::OpenSSH->new(localhost, password => foo)'
这主要涉及在主进程上分配一个伪终端对,然后在子进程中将pty的从部分设置为当前tty并执行ssh。