问题
我尝试使用libssh和libssh-C++-wrapper进行本地端口转发。我的意图是通过SSH将服务器上的端口localhost:3306
转发到我的机器上的localhost:3307
,以便通过MySQL连接到localhost:3307
。
void ssh_session::forward(){
ssh::Channel channel(this->session);
//remotehost, remoteport, localhost, localport
channel.openForward("localhost",3306,"localhost",3307);
std::cout<< "Channel is " << (channel.isOpen()?"open!":"closed!") << std::endl;
}
使用
ssh::Channel
构造函数中的session
类型应为ssh::Session
。以上代码将打印Channel is open!
。如果我尝试使用MySQL Connector/C++连接到localhost:3307
,我会得到以下错误:
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (61)
观察结果
- 如果我使用shell命令
$ ssh -L 3307:localhost:3306 me@myserver.com
,一切正常,我可以连接。 - 如果我在构造函数中使用
ssh::Session session
或ssh::Channel channel
执行远程shell命令,则一切正常,因此会话没问题! - libssh的文档(对于C++包装器
libsshpp.hpp
来说是一团糟,因为许多公共成员函数没有记录,必须查看源代码)显示ssh::Channel::openForward()
是C函数ssh_channel_open_forward()
的包装器 - ssh_channel_open_forward()的文档说明:
警告
此函数不绑定本地端口,也不自动将套接字内容转发到通道。 您仍然需要使用channel_read和channel_write进行操作。
我认为这可能是问题的原因。 我在ssh:Channel
中读写没有问题,但MySQL Connector/C++无法正常工作。
问题
如何实现与常见shell命令产生相同的行为?
$ ssh -L 3307:localhost:3306 me@myserver.com
使用libssh吗?
int mycppfunc(){return mycfunc()}
完全不同的C++包装器。由于libssh
是仅有的两个可靠的用C编写的SSH库之一,我认为很多C程序员都熟悉它。我看不到删除C标签的理由。 - dtell