2016-12-15 16 views
5

Xin chào Tôi đang phát triển một ứng dụng thử nghiệm để hiểu cách làm đường hầm SSH để kết nối với Cơ sở dữ liệu MySQL trong C++.SSH Tunneling tới MySQL bằng C++

Tôi đang sử dụng thư viện libssh2 và tôi đang sử dụng ví dụ từ https://www.libssh2.org/examples/direct_tcpip.html nhưng tôi không chắc chắn 100% liệu đây có phải là điều chính xác để sử dụng hay không.

tôi đã khá nhiều sao chép ví dụ nhưng khi kết nối với MySQL trên mysql ổ cắm của tôi ném

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

Khi tôi kết nối với mysql sử dụng mysql -p -uroot -P2222 ứng dụng của tôi đọc dữ liệu trên kênh sử dụng như sau:

int len = libssh2_channel_read(channel, buf, sizeof(len));

và buf chứa SSH-2.0- và sau đó điều này được ghi vào ổ cắm chuyển tiếp như sau:

wr = 0; 
while (wr < len) 
{ 
    i = send(forward_socket, buf + wr, len - wr, 0); 
    if (i <= 0) 
    { 
     perror("write"); 
     return EXIT_FAILURE; 
    } 
    wr += i; 
} 

Ngay sau khi gửi xong, tôi ngay lập tức nhận được lỗi mysql. Tôi cho rằng đó là bởi vì tôi đang gửi SSH-2.0- tới MySQL mà MySQL không mong đợi vì vậy nó đóng kết nối nhưng tôi không thể thấy có gì sai, và tôi không thể tìm thấy chắc chắn hay không libssh2 direct_tcpip là chính xác điều cần sử dụng.

Cảm ơn bạn đã trợ giúp bạn có thể cung cấp.

+0

Có một chủ đề tương tự tại đây http://stackoverflow.com/questions/21091850/error-2013-hy000-lost-connection-to-mysql-server-at-reading-authorization-pa – Misgevolution

+0

Điều đó không thực sự liên quan, có cùng một lỗi của nó nhưng đó là để làm với cấu hình MySQL/mạng không C + + lập trình tạo một đường hầm SSH đó là những gì tôi đang cố gắng để làm – Boardy

+0

Chờ đợi những gì là nó cố gắng của bạn để làm từ đầu. SSH Tunneling là một ổ cắm mà bạn sử dụng đường hầm Client port '8282' đến Server' 3306' một khi đã thiết lập máy khách MySQL của bạn sau đó có thể sử dụng 'localhost: 8282' trên máy khách của bạn EG MySQL Workbench để kết nối với' localhost: 8282' và nó sẽ kết nối với máy chủ của bạn trên cổng '3306' –

Trả lời

0

Cuối cùng, cố gắng tìm hiểu xem phải làm gì, với rất nhiều thử nghiệm và sửa lỗi và kéo tóc.

Sử dụng ví dụ từ https://www.libssh2.org/examples/direct_tcpip.html nhưng tôi đã đặt các biến có giá trị sai.

Về cơ bản, trong ví dụ nó có

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

Do remote_destport trong ví dụ là 22, tôi nghĩ đây là chi tiết kết nối SSH vì vậy tôi thiết lập này được thiết lập SSH của tôi.

Hóa ra đây là nơi kết nối được chuyển tiếp đến so với phiên SSH vì vậy tôi đã thay đổi nó được

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

Vì vậy, bây giờ tôi có thể chạy ứng dụng của tôi từ máy tính xách tay của tôi, trong đó kết nối với máy chủ SSH của tôi cho máy chủ web của tôi và sau đó trên máy tính xách tay của tôi chạy trong lệnh

mysql -uroot -p -P2222 và tôi kết nối với cơ sở dữ liệu trên máy chủ web thông qua đường hầm SSH.

1

Tôi nghĩ bạn đã hiểu lầm về những gì mà SSH Tunneling là.

Đường hầm SSH không có gì khác ngoài Bản đồ ổ cắm máy khách đến bản đồ ổ cắm máy chủ E.G Cổng mạng được tường lửa.

Putty Setup a SSH Tunnel

Và để cho biết đây là cách hoạt động. tôi đã sử dụng máy chủ web cá nhân của mình và kết nối với máy chủ MySQL không cho phép bất kỳ kết nối bên ngoài nào kết nối với máy chủ đó chỉ để kết nối từ máy chủ cục bộ.

Connection though SSH Tunnel

Để Thiết lập một đường hầm SSH sử dụng LibSSH2 theo mã tại http://api.libssh.org/master/libssh_tutor_forwarding.html dưới tiêu đề Làm cổng chuyển tiếp trực tiếp với libssh

Nếu bạn không muốn để lộ ánh xạ tới một cổng trên máy tính của khách hàng của bạn bạn không nhất thiết phải tự mình gửi dữ liệu xuống kênh và đọc nó nếu có bất kỳ hình thức mã hóa hoặc mã hóa văn bản nào không khớp với kênh của bạn tới mysql, bạn sẽ gửi dữ liệu không hợp lệ tới kênh đó. Vì vậy, một khi bạn đã tạo SSH Tunneling thì bạn sử dụng nó như một kết nối mạng chuẩn đến cổng bạn đã Tunnelled để nói chuyện với dịch vụ nếu bạn muốn làm điều này trong C++ sử dụng MySQL C++ Connector và một khi đường hầm được tạo kết nối bằng cách sử dụng Trình kết nối C++.

Nếu bạn muốn cho phép ứng dụng của mình nói chuyện với MySQL mặc dù kênh SSH không hiển thị nó với cổng mạng, bạn có thể sẽ phải gây rối với mã nguồn cho Trình kết nối MySQL của C++. Rất nhiều, nhiều công việc mà bạn nghĩ rằng đó là bạn sẽ đi mặc dù toàn bộ kết nối và bất kỳ văn bản và đọc nó thông qua các ổ cắm mạng và thay thế nó bằng mã để đi mặc dù kênh SSH Tunnel của bạn.

+0

Cảm ơn, tôi đã không hiểu sai đường hầm SSH, tôi đã thực hiện nó trước đây trong C# và tôi thường xuyên sử dụng nó, nhưng chuyển đổi ứng dụng C# thành C++ vì thế tại sao tôi cần đến đường hầm SSH . Các tài liệu của libssh2 có vẻ khá nghèo nên tôi đã tìm thấy một thư viện khác mà bây giờ tôi đang làm việc – Boardy

Các vấn đề liên quan