1

我正在尝试使用使用 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 连接字符串中使用的凭据连接到它......我希望有人能提供帮助

4

1 回答 1

3

我刚刚自己解决了这个问题。只需将 ForwardedPortLocal 更改为:

    var local = new ForwardedPortLocal("127.0.0.1", 3306, "127.0.0.1", 3306);

在您的原始文件中,您将源端口指定为22. 但是,您的 MySql 连接将连接到3306本地计算机上的端口(然后您将通过隧道连接到目标上的端口 3306),因此您需要确保转发的端口在本地侦听 3306 开始。

此外,我已更改localhost127.0.0.1. 我遇到的第二个问题是,localhost在我的机器上实际上解析为::1IPv6 地址,而目标服务器没有“说”IPv6。通过将其切换到127.0.0.1(IPv4 的 localhost 版本),可以确保默认使用 IPv4。

于 2013-08-29T10:46:29.460 回答