【发布时间】:2017-05-01 10:46:09
【问题描述】:
我正在开发一个测试应用程序,以了解如何使用 SSH 隧道连接到 C++ 中的 MySQL 数据库。
我正在使用 libssh2 库,并且正在使用来自 https://www.libssh2.org/examples/direct_tcpip.html 的示例,但我不能 100% 确定这是否是正确的使用方法。
我几乎复制了这个示例,但是在我的套接字上连接到 MySQL 时,MySQL 抛出:
Errro 2013 (HY000):在“读取通信数据包”时丢失与 mysql 服务器的连接,系统错误:0
当我使用 mysql -uroot -p -P2222 连接到 mysql 时,我的应用程序使用以下命令读取通道上的数据:
int len = libssh2_channel_read(channel, buf, sizeof(len));
并且buf包含SSH-2.0-,然后将其写入转发套接字,如下所示:
wr = 0;
while (wr < len)
{
i = send(forward_socket, buf + wr, len - wr, 0);
if (i <= 0)
{
perror("write");
return EXIT_FAILURE;
}
wr += i;
}
发送完成后,我立即收到 mysql 错误。我认为这是因为我将 SSH-2.0- 发送到 MySQL 没有预料到的 MySQL,所以它关闭了连接,但我看不出有什么问题,而且我无法确定 libssh2 direct_tcpip 是否正确使用的东西。
【问题讨论】:
-
这里有一个类似的帖子stackoverflow.com/questions/21091850/…
-
这并不真正相关,是的,它是相同的错误,但这与 MySQL 配置/网络有关,而不是 C++ 以编程方式创建 SSH 隧道,这是我想要做的
-
等等,你从一开始就想做什么。 SSH隧道是一个套接字,例如,您将客户端端口
8282隧道连接到服务器3306,一旦设置好,您的MySQL客户端就可以在您的客户端机器上使用localhost:8282,例如MySQL Workbench连接到localhost:8282,它将连接到你的服务器在端口3306 -
理解概念证明没什么问题,但是如果我听说有人在现实世界中这样做,我强烈建议不要这样做我很难理解你为什么要在其中进行 ssh 隧道干净轻松的应用程序可以是应用程序之外的一个层。此外,MySQL 已经在数据流上提供了 ssl 加密功能,使 ssh 隧道更多地成为运行时细节。
-
它是 Android 应用程序 API 的一部分