How to detect when ssh connection (over a QProcess) has finished?
我正在使用
1 2 | QProcess* process = new QProcess(); process->start("ssh", QStringList()<<"-L"<<"27017:localhost:27017"<<"example.com"); |
到目前为止,它工作得很好,唯一的问题是,我没有办法知道这个港口是什么时候真正建成的。
当我在shell上运行该命令时,连接到远程主机大约需要10秒钟,之后转发端口就可以使用了。如何从我的应用程序中检测它?
编辑:
正如Vahancho所建议的,我使用了这样一个事实:在终端上有一些输出可以用来检测连接是否成功。然而,有一条线在发射
所以,唯一剩下的问题是,在这种方法中,有人能毫无顾虑地帮助我吗?
So, the only question left is, can anyone help me without any concerns in this approach?
不幸的是,这不是一个稳定且健壮的解决方案。同样,处理git输出而不是使用实际的库也是一个破碎的概念。主要的问题是这些软件对输出兼容性没有任何保证,这是正确的。
想象一下,如果他们的文字不清晰,打字错误,等等,没有被注意到,会发生什么。它们本质上需要分别修复输出,并且依赖输出的所有应用程序都将突然中断。
这也是在专用库中工作的原因,这些库提供了对重用功能的访问,而不是直接使用面向用户的输出。例如,对于git,这意味着libgit2库。
qt在默认情况下没有ssh机制,就像在python中可以有这样的库一样,例如paramiko。
我建议在您的代码中建立一种方法,使用
也就是说,很高兴在Qt项目中看到类似的附加库,但这可能不会很快发生。如果您在编写软件时考虑到了正确的设计,那么一旦有人站起来维护这样一个额外的库到qt或其他地方,您就可以切换到这样一个库,其中包含我们的主要问题。
我也有同样的问题,但在我的例子中,ssh不输出任何东西——所以我不能只等待输出。我还使用ssh设置隧道,所以我使用qtcpsocket:
1 2 3 4 | 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()槽:
1 2 3 4 5 6 7 8 9 | QTcpSocket sock; sock.connectToHost("127.0.0.1", 3306); if(sock.waitForConnected(100000)) { sock.disconnectFromHost(); openDatabaseConnection(); } else qDebug() <<"timeout"; |
我希望这能帮助未来人们找到这个问题;)