繁体   English   中英

如何检测ssh连接(通过QProcess)何时完成?

[英]How to detect when ssh connection (over a QProcess) has finished?

我正在使用QProcess从应用程序运行ssh隧道:

QProcess* process = new QProcess();
process->start("ssh", QStringList()<<"-L"<<"27017:localhost:27017"<<"example.com");

到目前为止,它运行良好,唯一的问题是我没有办法查看端口的实际创建时间。

当我在外壳上运行命令时,连接到远程主机大约需要10秒钟,然后转发端口就可以使用了。 如何从我的应用程序中检测到它?

编辑:

正如vahancho所建议的那样,我使用了以下事实:连接后在终端上有一些输出可用于检测连接是否成功。 但是,有一行会在启动后立即运行, Pseudo-terminal will not be allocated because stdin is not a terminalPseudo-terminal will not be allocated because stdin is not a terminal ,这可能会产生错误警报。 正确的输出在第二个信号中可用,稍后发出(这是端口已打开的真实指示)。 为了摆脱第一条消息,我现在使用ssh -t -t运行ssh来强制进行stdin分配。

因此,剩下的唯一问题是,任何人都可以在这种方法上毫无顾虑地为我提供帮助吗?

因此,剩下的唯一问题是,任何人都可以在这种方法上毫无顾虑地为我提供帮助吗?

不幸的是,这不是一个稳定可靠的解决方案。 与处理git输出而不是使用实际库类似,这是一个破损的概念。 主要问题在于,这些软件不能正确保证输出兼容性。

试想一下,如果他们有不清楚的文字,错别字等等,而未注意到,会发生什么。 他们固有地需要分别固定输出,并且所有依赖于输出的应用程序都会突然中断。

这也是在专用库上工作的原因,该库提供对功能的访问以进行重用,而不是直接与面向用户的输出一起使用。 例如,对于git,这意味着libgit2库。

Qt默认没有ssh机制,就像您可以在python中拥有这样的库一样,例如paramiko。

我建议您使用libsshlibssh2在您的代码中建立一种方法,就像您在注释中指出的那样。 我可以理解,到目前为止,这还不是真正的Qt'ish方式带来的不便,但是在没有第三方的情况下,Qt无法提供更强大的功能。

话虽这么说,将来在Qt项目中看到类似的附加库将是一件很高兴的事情,但这可能不会很快发生。 如果您在编写软件时考虑到适当的设计,一旦有人站起来维护Qt或其他地方的此类附加库,就可以在遇到重大问题时切换到此类库。

我有同样的问题,但是在我的情况下ssh不会输出任何内容-因此我不能只等待输出。 我也使用ssh来建立隧道,所以我使用了QTcpSocket:

program = "ssh";
arguments << m_host << "-N" << "-L" << QString("3306:%1:3306").arg(m_host);
connect(tunnelProcess, &QProcess::started, this, &Database::waitForTunnel);
tunnelProcess->start(program, arguments);

waitForTunnel()插槽:

QTcpSocket sock;
sock.connectToHost("127.0.0.1", 3306);
if(sock.waitForConnected(100000))
{
     sock.disconnectFromHost();
     openDatabaseConnection();
}
else
    qDebug() << "timeout";

我希望这将有助于将来的人们找到这个问题;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM