如何检测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");
到目前为止,它运行得很好,唯一的问题是我无法看到端口何时真正创建。
当我在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。
我建议在代码中使用libssh
或libssh2
来建立一种方法,正如您在评论中所指出的那样。到目前为止,我可以理解这不是一种真正的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";
我希望这将帮助未来的人们找到这个问题;)
- 通过方法访问结构
- 通过递归进行因子分解
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 尝试通过多个向量访问变量时,向量下标超出范围
- C++如何通过用户输入删除列表元素
- 通过多个头文件使用常量变量
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何通过派生类函数更改基类中的向量
- 无法通过空白将文本文件行分隔为矢量
- QProcess无法通过QPushButton执行终端线路命令
- 如何在Windows上通过QProcess启动提升的子进程?
- 通过stdin/stdout和qdatastream与Qprocess进行通信
- 如何使用QProcess通过Ping检测"Network is Unreachable"?
- 如何检测ssh连接(通过QProcess)何时完成
- 命令在终端中工作,但不通过 QProcess
- 通过QProcess执行VBS从不发出readyStandardOutPut
- Qt通过qprocess运行shell命令
- Qt - 显示 PowerShell 通过 QProcess 运行的结果
- 如何在GUI中通过按钮或键盘使QProcess停止