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

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

本文关键字:通过 QProcess 何时完 连接 ssh 检测 何检测      更新时间:2023-10-16

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

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 -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";

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