我正在开发一个测试应用程序,以了解如何使用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是否正确使用。
答案 0 :(得分:1)
我认为您误解了SSH隧道是什么。
SSH隧道只不过是一个客户端套接字到服务器套接字映射E.G一个防火墙网络端口。
并表明这是它的工作原理。我使用我的个人Web服务器并连接到MySQL服务器,该服务器不允许任何外部连接,因此只能从localhost连接。
使用LibSSH2设置SSH隧道请遵循标题“使用libssh进行直接端口转发”标题下的http://api.libssh.org/master/libssh_tutor_forwarding.html处的代码
如果您不希望将映射公开给客户端计算机上的端口,那么您不一定需要手动向通道发送数据并读取它,但是如果有任何形式的加密或文本编码与您在通道上与mysql不匹配,您将向其发送无效数据。
因此,一旦您创建了SSH隧道,那么您可以将它用作隧道端口的标准网络连接,如果您希望在C ++中使用MySQL C++ Connector并且隧道是使用C ++连接器创建连接。
如果您希望允许您的应用程序通过SSH通道与MySQL通信而不将其暴露给网络端口,您可能不得不搞乱C ++ MySQL连接器的源代码。很多,你认为通过网络套接字完成连接器和任何写入和读取的工作,你会通过网络套接字将其替换为通过SSH隧道通道。
答案 1 :(得分:0)
最后,设法弄清楚要做什么,通过大量的试验和错误以及头发拉动来管理它。
使用https://www.libssh2.org/examples/direct_tcpip.html中的示例,但我使用错误的值设置变量。
基本上,在示例中它有
const char *remote_desthost = "localhost"; /* resolved by the server */
unsigned int remote_destport = 22;
由于示例中的remote_destport为22,我认为这是SSH连接细节,所以我将其设置为我的SSH设置。
事实证明这是连接从SSH会话转发到的地方所以我将其更改为
const char *remote_desthost = "localhost"; /* resolved by the server */
unsigned int remote_destport = 3306;
所以现在我可以从我的笔记本电脑运行我的应用程序,该笔记本电脑连接到我的网络服务器的SSH服务器,然后在我的笔记本电脑上运行命令
mysql -uroot -p -P2222
我通过SSH隧道连接到我的网络服务器上的数据库。