我正在使用QProcess从应用程序运行ssh隧道:
QProcess* process = new QProcess();
process->start("ssh", QStringList()<<"-L"<<"27017:localhost:27017"<<"example.com");
到目前为止,它运行良好,唯一的问题是我没有办法查看端口的实际创建时间.
当我在外壳上运行命令时,连接到远程主机大约需要10秒钟,然后转发端口就可以使用了.如何从我的应用程序中检测到它?
编辑:
正如vahancho所建议的那样,我使用了以下事实:连接后在终端上有一些输出可用于检测连接是否成功.但是,有一行在启动后立即运行,不会分配伪终端,因为stdin不是终端,这可能会产生错误警报.正确的输出在第二个信号中可用,稍后发出(这是端口已打开的真实指示).为了摆脱第一条消息,我现在使用ssh -t -t运行ssh来强制进行stdin分配.
因此,剩下的唯一问题是,任何人都可以在这种方法上毫无顾虑地为我提供帮助吗?
解决方法:
So, the only question left is, can anyone help me without any concerns in this approach?
不幸的是,这不是一个稳定可靠的解决方案.与处理git输出而不是使用实际库类似,这是一个破损的概念.主要问题在于,这些软件不能正确保证输出兼容性.
试想一下,如果他们有不清楚的文字,错别字等等,而未注意到,会发生什么.他们固有地需要分别固定输出,并且所有依赖于输出的应用程序都会突然中断.
这也是在专用库上工作的原因,该库提供对功能的访问以进行重用,而不是直接与面向用户的输出一起使用.例如,对于git,这意味着libgit2库.
Qt默认情况下没有ssh机制,就像您可以在python中拥有这样的库一样,例如的paramiko.
我建议您使用libssh或libssh2在您的代码中建立一种方法,就像您在注释中指出的那样.我可以理解,到目前为止,这还不是真正的Qt’ish方式带来的不便,但是在没有第三方的情况下,Qt无法提供更强大的功能.
话虽这么说,将来在Qt项目中看到类似的附加库将是一件很高兴的事情,但这可能不会很快发生.如果您在编写软件时考虑到适当的设计,一旦有人站起来维护Qt或其他地方的此类附加库,就可以在遇到重大问题时切换到此类库.