【问题标题】:How to detect when ssh connection (over a QProcess) has finished?如何检测 ssh 连接(通过 QProcess)何时完成?
【发布时间】:2013-12-23 12:39:06
【问题描述】:

我正在使用 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 来强制分配标准输入。

那么,剩下的唯一问题是,任何人都可以帮助我而不用担心这种方法吗?

【问题讨论】:

  • 连接完成后ssh有输出吗?
  • 其实..是的。谢谢你的想法!我现在就去试试……
  • 这几乎可以工作。第一行是“不会分配伪终端,因为标准输入不是终端”。这会在启动进程后立即发生。我再次收到 readyReadStandardOuptut 信号,此时它实际上已准备好使用。但是,我不确定这是否可以保证在所有平台上一直发生。有什么建议吗?
  • 我能够使用这个“ssh -t -t”来摆脱第一条消息。取自stackoverflow.com/questions/7114990/…。有什么你能想到的顾虑吗?
  • 实际上,我真正考虑的是继续使用 libssh 对隧道过程进行更精细的控制,这看起来也是实现更健壮系统的方法。

标签: c++ qt ssh qprocess qtcore


【解决方案1】:

那么,剩下的唯一问题是,任何人都可以帮助我而不用担心这种方法吗?

不幸的是,这不是一个稳定而强大的解决方案。处理 git 输出而不是使用实际的库同样是一个错误的概念。主要问题是这些软件对输出兼容性没有任何保证。

想象一下,如果他们有一个不清楚的文本、一个错字等等,没有注意到会发生什么。它们天生需要分别修复输出,所有依赖输出的应用程序都会突然崩溃。

这也是开发专用库的原因,这些库可以访问功能以供重用,而不是直接处理面向用户的输出。例如,对于 git,这意味着 libgit2 库。

Qt 默认没有 ssh 机制,就像你可以在 python 中拥有这样的库,例如帕拉米科。

我建议使用libsshlibssh2 在您的代码中建立一种方式,正如您在评论中也指出的那样。到目前为止,我可以理解这不是真正的 Qt 方式带来的不便,但在这一点上,如果没有第三方,Qt 无法提供更强大的功能。

话虽如此,未来很高兴在 Qt 项目中看到类似的附加库,但这可能不会很快发生。如果您在编写软件时考虑到了正确的设计,那么一旦有人站出来为 Qt 或其他地方维护这样一个额外的库,您就可以切换到这样的库而不会出现重大问题。

【讨论】:

  • 感谢您的回答。我完全同意你的说法,这就是我决定继续进行的:)
  • @RohanPrabhu:太好了,np。
【解决方案2】:

我遇到了同样的问题,但在我的情况下 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";

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 2020-10-10
    • 2012-04-29
    • 2020-08-28
    • 2021-05-26
    • 2015-09-19
    相关资源
    最近更新 更多