2016-12-15 71 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