4

在此处输入图像描述

我正在开发一个网页(ASP.NET/C#),它通过 SSH 查询远程服务器上的(MySQL)数据库。我正在使用这两个库(mysql-connector-net-6.9.7)和(Renci.SshNet.dll)。

我可以使用远程服务器上的 MySQL Workbench 通过 SSH 连接访问 MySQL 数据库:
portal.RemoteServer.edu:22 ”使用“ RemoteServerUsername ”和
RemoteServerPassword ”。

这是我的 C# 代码,它不会从远程服务器上的 Clients 表中返回任何数据:

MySqlConnectionStringBuilder connBuilder = new MySqlConnectionStringBuilder();
connBuilder.AllowBatch = true;
connBuilder.Server = "127.0.0.1";
connBuilder.Port = 3306;
connBuilder.UserID = "LocalHostUserID";
connBuilder.Password = "LocalHostPassword";
connBuilder.Database = "DatabaseName";

var auth =
    new PasswordAuthenticationMethod("RemoteServerUsername", "RemoteServerPassword");
ConnectionInfo conInfo =
    new ConnectionInfo("portal.RemoteServer.edu", "RemoteServerUsername", auth);

using (SshClient client = new SshClient(conInfo))
{
    ForwardedPortLocal port = new ForwardedPortLocal("127.0.0.1", 0, "127.0.0.1", 22);
    client.Connect();
    client.AddForwardedPort(port);
    port.Start();
    MySqlConnection conn = new MySqlConnection(connBuilder.ConnectionString);
    conn.Open();
    conn.ChangeDatabase(connBuilder.Database);

    var command = "SELECT * FROM DatabaseName.Clients LIMIT 10";
    using (MySqlCommand cmd = new MySqlCommand(command))
    {
        using (MySqlDataAdapter sda = new MySqlDataAdapter())
        {
            cmd.Connection = conn;
            sda.SelectCommand = cmd;
            using (DataTable dt = new DataTable())
            {
                sda.Fill(dt);
                GridView1.DataSource = dt;
                GridView1.DataBind();
            }
        }
    }
}
4

2 回答 2

12

下面的大部分代码都是不言自明的。我仍然提出了必要的意见。我能够使用下面的代码连接到 MySql 数据库。我从这里使用了 SSH 库和用于 .NET 的 MySql 连接器。

using(var client = new SshClient("ssh server id", "sshuser", "sshpassword")) // establishing ssh connection to server where MySql is hosted
{
    client.Connect();
    if (client.IsConnected)
    {
        var portForwarded = new ForwardedPortLocal("127.0.0.1", 3306, "127.0.0.1", 3306);
        client.AddForwardedPort(portForwarded);
        portForwarded.Start();
        using (MySqlConnection con = new MySqlConnection("SERVER=127.0.0.1;PORT=3306;UID=someuser;PASSWORD=somepass;DATABASE=Dbname"))
        {
            using (MySqlCommand com = new MySqlCommand("SELECT * FROM cities", con))
            {
                com.CommandType = CommandType.CommandText;
                DataSet ds = new DataSet();
                MySqlDataAdapter da = new MySqlDataAdapter(com);
                da.Fill(ds);
                foreach (DataRow drow in ds.Tables[0].Rows)
                {
                    Console.WriteLine("From MySql: " + drow[1].ToString());
                }
            }
        }
        client.Disconnect();
    }
    else
    {
        Console.WriteLine("Client cannot be reached...");
    }
}
于 2016-04-09T13:07:48.110 回答
3
  1. 您必须将本地端口转发到远程 MySQL 端口 ( 3306),而不是 SSH 端口22(这会创建一个循环)。

  2. 您正在传递0给. 这意味着操作系统会自动选择端口号。然而,您正试图通过固定端口连接到 MySQL 。boundPortForwardedPortLocal3306

    • 要么将固定端口传递3306ForwardedPortLocal

      port = new ForwardedPortLocal("127.0.0.1", 3306, "127.0.0.1", 3306);
      

      如果本地 MySQL 数据库已经使用本地 3306 端口,这将不起作用。您当然可以使用任何其他本地端口(尽管远程端口必须是 3306)。

    • 或者使用port.BoundPort值(在调用 之后port.Start())为connBuilder.Port.

      port.Start();
      connBuilder.Port = port.BoundPort;
      conn = new MySqlConnection(connBuilder.ConnectionString);
      

      确保您拥有最新版本的 SSH.NET 库。旧.BoundPort版本中没有更新

    请注意,第一个127.0.0.1是指您的本地机器(IP 地址相对于您的本地机器),而第二个是指服务器(IP 地址是相对于服务器机器)。您通常可以省略第一个参数。

于 2015-09-16T09:56:26.213 回答