关于c ++:如何检测ssh连接(通过QProcess)何时完成?

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

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

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

到目前为止,它工作得很好,唯一的问题是,我没有办法知道这个港口是什么时候真正建成的。

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

编辑:

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

所以,唯一剩下的问题是,在这种方法中,有人能毫无顾虑地帮助我吗?


So, the only question left is, can anyone help me without any concerns in this approach?

不幸的是,这不是一个稳定且健壮的解决方案。同样,处理git输出而不是使用实际的库也是一个破碎的概念。主要的问题是这些软件对输出兼容性没有任何保证,这是正确的。

想象一下,如果他们的文字不清晰,打字错误,等等,没有被注意到,会发生什么。它们本质上需要分别修复输出,并且依赖输出的所有应用程序都将突然中断。

这也是在专用库中工作的原因,这些库提供了对重用功能的访问,而不是直接使用面向用户的输出。例如,对于git,这意味着libgit2库。

qt在默认情况下没有ssh机制,就像在python中可以有这样的库一样,例如paramiko。

我建议在您的代码中建立一种方法,使用libsshlibssh2,正如您在注释中指出的那样。我可以理解,目前为止,这种不便并不是真正意义上的夸脱方式,但在这一点上,没有第三方,夸脱就无法提供更强大的功能。

也就是说,很高兴在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";

我希望这能帮助未来人们找到这个问题;)