我正在使用QProcess
:
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分配。
所以,唯一的问题是,任何人都可以帮助我而不用担心这种方法吗?
答案 0 :(得分:2)
所以,唯一的问题是,任何人都可以帮助我而不用担心这种方法吗?
遗憾的是,这不是一个稳定而强大的解决方案。处理git输出而不是使用实际库同样是一个破碎的概念。主要问题是这些软件没有任何保证输出兼容性的权利。
想象一下,如果他们有一个不清楚的文字,一个错字,等等,没有注意到会发生什么。它们本身就需要分别修复输出,所有依赖输出的应用程序都会突然中断。
这也是在专用库上工作的原因,这些库提供了对重用功能的访问,而不是直接使用面向用户的输出。在git的情况下,这意味着例如libgit2库。
默认情况下,Qt没有ssh机制,就像你可以在python中拥有这样的库一样,例如:的paramiko。
我建议您使用libssh
或libssh2
在代码中建立一种方式,因为您在评论中也注意到了这一点。我可以理解现在不是真正的Qt'ish方式带来的不便,但是在这一点上Qt无法在没有第三方的情况下提供更强大的功能。
话虽如此,很高兴在Qt项目中看到类似的附加库,但这可能不会很快发生。如果您在编写软件时考虑了适当的设计,那么一旦有人站起来为Qt或其他地方维护这样一个额外的库,您就可以切换到这样一个主要问题的库。
答案 1 :(得分:0)
我有同样的问题,但在我的情况下,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";
我希望这能帮助未来的人找到这个问题;)