使用SSH.NET库从.NET连接到MySQL

use*_*799 2 c# mysql asp.net ssh mysql-workbench

在此输入图像描述

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

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

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Configuration;
using MySql.Data.MySqlClient;
using Renci.SshNet;
using Renci.SshNet.Common;
namespace WebApplication1
{
    public partial class About : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            MySqlConnection conn = null;
            SshClient client = null;
            ForwardedPortLocal port = null;

            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";

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

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

                    using (MySqlCommand cmd = new MySqlCommand("SELECT * FROM DatabaseName.Clients LIMIT 10"))
                    {
                        using (MySqlDataAdapter sda = new MySqlDataAdapter())
                        {
                            cmd.Connection = conn;
                            sda.SelectCommand = cmd;
                            using (DataTable dt = new DataTable())
                            {
                                sda.Fill(dt);
                                GridView1.DataSource = dt;
                                GridView1.DataBind();
                            }
                        }
                    }
                }
                catch (Exception ex) {}
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在应用了@Martin Prikryl的答案之后的代码,但它仍然无法正常工作.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Configuration;
using MySql.Data.MySqlClient;
using Renci.SshNet;
using Renci.SshNet.Common;
namespace WebApplication1
{
    public partial class About : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            MySqlConnection conn = null;
            SshClient client = null;
            ForwardedPortLocal port = null;

            MySqlConnectionStringBuilder connBuilder = new MySqlConnectionStringBuilder();
            connBuilder.AllowBatch = true;
                        connBuilder.Server = "127.0.0.1";
        connBuilder.Port = 3306;
        connBuilder.UserID = "remoteUsername";
        connBuilder.Password = "remotePassword";
        connBuilder.Database = "databasename";

        ConnectionInfo conInfo = new ConnectionInfo("portal.remoteserver.edu", 22, "remoteUsername", new PasswordAuthenticationMethod("remoteUsername", "remotePassword"));

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

                    using (MySqlCommand cmd = new MySqlCommand("SELECT * FROM DatabaseName.Clients LIMIT 10"))
                    {
                        using (MySqlDataAdapter sda = new MySqlDataAdapter())
                        {
                            cmd.Connection = conn;
                            sda.SelectCommand = cmd;
                            using (DataTable dt = new DataTable())
                            {
                                sda.Fill(dt);
                                GridView1.DataSource = dt;
                                GridView1.DataBind();
                            }
                        }
                    }
                }
                catch (Exception ex) {}
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Shi*_*ari 9

下面的大部分代码都是自我解释的.我仍然提出了必要的评论.我能够使用下面的代码连接到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...");
    }
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ryl 3

  1. 您必须将本地端口转发到远程 MySQL 端口 ( 3306),而不是 SSH 端口22(这会创建循环)。

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

    • 将固定端口传递3306ForwardedPortLocal

      port = new ForwardedPortLocal("127.0.0.1", 3306, "127.0.0.1", 3306);
      
      Run Code Online (Sandbox Code Playgroud)

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

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

      port.Start();
      connBuilder.Port = port.BoundPort;
      conn = new MySqlConnection(connBuilder.ConnectionString);
      
      Run Code Online (Sandbox Code Playgroud)

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

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