我正在开发一个测试应用程序,以了解如何进行SSH隧道连接到MySQL数据库的C++。
我使用的是libssh2库,我使用的是来自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是否正确使用。
发布于 2016-12-31 00:50:37
最后,设法找出该做什么,与大量的尝试和错误和拔头发管理它。
使用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;所以现在我可以从我的笔记本电脑上运行我的应用程序,它连接到我的web服务器的SSH服务器,然后在我的笔记本上运行在命令中。
mysql -uroot -p -P2222和我通过SSH隧道连接到SSH服务器上的数据库。
发布于 2016-12-22 16:48:57
我想你误解了SSH隧道是什么。
SSH隧道只不过是一个客户端套接字到服务器套接字映射E.G,一个防火墙网络端口。

来证明这就是它的工作原理。我使用我的个人web服务器,并连接到一个不允许任何外部连接到它的MySQL服务器,因此只能从本地主机连接。

若要使用LibSSH2设置SSH隧道,请按照标题下的forwarding.html代码,使用libssh进行直接端口转发。
如果您不想将映射公开到客户端计算机上的端口,则不必手动将数据发送到通道并读取它,但是,如果有任何形式的加密或文本编码与您在通道上的数据与mysql不匹配,则将向其发送无效数据。
因此,一旦您创建了SSH隧道,那么您就可以将它作为到端口的标准网络连接使用,如果您希望在C++中这样做,请使用MySQL C++连接器,并且一旦隧道使用C++连接器创建连接,就可以与服务进行通信。
如果希望允许应用程序通过SSH通道与MySQL对话,而不将其暴露于网络端口,则可能需要处理C++ MySQL连接器的源代码。很多,更多的工作,你认为你会通过整个连接器和任何书写和阅读,通过网络套接字,并取代它的代码,以通过您的SSH隧道通道。
https://stackoverflow.com/questions/41170816
复制相似问题