2016-12-15 72 views
5

嗨,我正在开发一个测试应用程序,以了解如何使用SSH隧道连接到C++中的MySQL数据库。在C++中使用SSH隧道到MySQL

我使用的是libssh2库,我使用的示例来自https://www.libssh2.org/examples/direct_tcpip.html,但我并不是100%确定这是否是正确的使用方法。

我已经差不多复制的例子,但连接到MySQL在我的插座MySQL时抛出

Errro 2013 (HY000): Lost connection to mysql server at 'reading communication packet', system error: 0

当我连接使用到mysql的mysql -uroot -p -P2222我的应用程序使用的通道上读取数据以下内容:

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

还有一个类似的线程在这里http://stackoverflow.com/questions/21091850/error-2013-hy000-lost-connection-to-mysql-server-at-reading-authorization-pa – Misgevolution

+0

这并没有真正相关,是的,它是同样的错误,但这是关于MySQL配置/网络而不是C++编程创建一个SSH隧道,这是我正在尝试做的 – Boardy

+0

等待你从一开始就试图做什么。 SSH隧道是一种套接字事情EG,当客户机上的客户端设备EG MySQL Workbench连接到'localhost:8282'时,您就可以将客户端端口'8282'隧道连接到服务器'3306',然后设置您的MySQL客户端然后可以使用'localhost:8282'它会连接到你的服务器的端口'3306' –

回答

0

最后,设法弄清楚该怎么做,有大量的试验和错误和头发拉管理它。

使用https://www.libssh2.org/examples/direct_tcpip.html中的例子,但我设置了错误值的变量。

基本上,例如,它具有

const char *remote_desthost = "localhost"; /* resolved by the server */ 
unsigned int remote_destport = 22; 

因为在例子是22 remote_destport的,我认为这是SSH连接的细节,所以我将其设置为我的SSH设置。

事实证明,这是那里的连接会从SSH会话,所以我改变了它是

const char *remote_desthost = "localhost"; /* resolved by the server */ 
unsigned int remote_destport = 3306; 

所以,现在我可以从我的笔记本电脑,它连接到我的SSH服务器上运行我的应用程序转发到我的网络服务器,然后在我的笔记本电脑上运行命令

mysql -uroot -p -P2222和我通过SSH隧道连接到我的网络服务器上的数据库。

1

我想你已经误解了SSH隧道是什么。

SSH隧道只不过是一个客户端套接字到服务器套接字映射E.G防火墙网络端口。

Putty Setup a SSH Tunnel

,并表明这是它如何工作的。我使用我的个人Web服务器并连接到一个不允许任何外部连接的MySQL服务器,所以只能连接到本地主机。

Connection though SSH Tunnel

要安装使用LibSSH2跟随代码在标题下http://api.libssh.org/master/libssh_tutor_forwarding.html这样做的直接端口转发libssh

如果你不想暴露你的客户端机器上的映射到端口一个SSH隧道你不必一定要手动将数据发送到频道然后阅读,但如果有任何形式的加密或文本编码与你的频道不匹配,你就会向它发送无效数据。

因此,一旦您创建了SSH隧道,您就可以使用它作为标准网络连接到您已隧道与服务对话的端口,如果您希望在C++中使用MySQL C++ Connector,并且隧道一旦创建连接使用C++连接器。

如果您希望允许您的应用程序通过SSH通道与MySQL通信而不将其暴露给网络端口,那么您可能必须弄乱C++ MySQL连接器的源代码。很多工作,你认为它是你会通过整个连接器,并通过网络套接字进行任何写入和读取,并用代码替换它以通过SSH隧道通道。

+0

谢谢,我没有误解SSH隧道,我以前在C#中做过,我经常使用它,但是将C#应用程序转换为C++,因此为什么需要SSH隧道。 libssh2的文档看起来很差,所以我找到了另一个我现在正在使用的库 – Boardy