用c ++在SSH隧道到MySQL

时间:2016-12-15 18:17:54

标签: c++ mysql sockets ssh

我正在开发一个测试应用程序,以了解如何使用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是否正确使用。

2 个答案:

答案 0 :(得分:1)

我认为您误解了SSH隧道是什么。

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

Putty Setup a SSH Tunnel

并表明这是它的工作原理。我使用我的个人Web服务器并连接到MySQL服务器,该服务器不允许任何外部连接,因此只能从localhost连接。

Connection though SSH Tunnel

使用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隧道连接到我的网络服务器上的数据库。