我正在尝试使用使用OpenSSH密钥文件和SSH.Net库设置的SSH隧道连接到远程mysql服务器,如下面的代码部分所示...
try
{
PrivateKeyFile pkfile = new PrivateKeyFile("C:\\Users\\OpenSSHKey", "mypassword");
var client = new SshClient("servername.com", 22, "myusername", pkfile);
client.Connect();
if (client.IsConnected)
{
var local = new ForwardedPortLocal(22, "localhost", 3306);
client.AddForwardedPort(local);
try
{
local.Start();
}
catch (SocketException se)
{
}
string connStr = "server=localhost;user=mysql_username;database=database_name;port=3306;password=MyDBPassword;";
MySqlConnection sql = new MySqlConnection(connStr);
sql.Ping();
try
{
sql.Open();
}
catch (MySqlException se)
{
}
}
}
catch(Exception e)
{
}
隧道肯定是设置好的,因为它会在sql.Open()调用中抛出以下错误“无法连接到任何指定的MySQL主机”...
我确定数据库位于名为mysername的服务器上,因为我可以使用putty或workbench连接到它,并使用MYSQL连接字符串中使用的凭据...我希望有人可以提供帮助
答案 0 :(得分:3)
我自己刚刚解决了这个问题。只需将您的ForwardedPortLocal更改为:
var local = new ForwardedPortLocal("127.0.0.1", 3306, "127.0.0.1", 3306);
在原始版本中,您将源端口设为22
。但是,您的MySql连接将连接到本地计算机上的端口3306
(然后您将通过隧道传输到目标上的端口3306),因此您需要确保转发的端口在3306上本地侦听从...开始。
此外,我已将localhost
更改为127.0.0.1
。我遇到的第二个问题是我的计算机上的localhost
实际上已解析为::1
,这是一个IPv6地址,而目标服务器并没有“说”IPv6。通过将其切换到127.0.0.1
(IPv4的localhost版本),它可以确保默认使用IPv4。