5

我得到了一个链接,可以使用这个库通过 SSH 连接到使用 C# 的 MySQL 数据库进行连接。

这是该库的链接,因为您不需要手动打开 SSH 通道,很多人会发现这很有趣。

这是一个非常详细的库,有很多功能,但我想做的很简单。每次我想写入数据库时​​,我只想打开一个 SSH 通道。

在搜索提供的源代码时,我想到了可以在TestSshCommand.cs中找到的这部分代码,我想我可以将这部分用于我的连接,但我需要你的帮助才能让它像我一样工作我的连接字符串我不知道如何连接所有这些。

代码:

public void Test_Execute_SingleCommand()
        {
            using (var client = new SshClient(Resources.HOST, Resources.USERNAME, Resources.PASSWORD))
            {
                client.Connect();
                var result = ExecuteTestCommand(client);
                client.Disconnect();

                Assert.IsTrue(result);
            }

我连接到非 SSH 通道的代码是:

con.ConnectionString = ConfigurationManager.ConnectionStrings["Con2"].ConnectionString;
            con.Open();
            cmd = new MySqlCommand("SELECT COUNT(*) FROM " + ConfigSettings.ReadSetting("main"), con);

     //...... more of the code

那么如何将这段代码与上面的代码结合起来,以便它可以首先打开一个 SSH 通道,然后执行我的查询呢?

我需要将我的代码放在连接断开功能中吗?

另一个人认为我在引用中添加了.dll文件,我必须说所有导入都不起作用。所以有人可以下载这个库并尝试这个简单的代码,看看你的项目是否有参考,这样每个人(很多人)都可以为他们未来的项目找到一个可行的解决方案吗?

编辑:

这是我稍后尝试做的代码。我的 SSH 连接现在只需将这两者结合起来即可工作。

问题是我需要在我的电脑上本地拥有一个数据库并且需要连接到服务器。所以端口转发不会像论坛上所说的那样,当mysql已经有端口可以运行时我不能转发端口

using (var client = new SshClient("cpanel****", "******", "******"))
          {
            client.Connect();
            con = new MySqlConnection(GetConnectionString());
            con.Open();
            cmd = new MySqlCommand(String.Format("insert into {0} values (null, ?Parname , ?Parname2, ?Parname3, ?Parname4, ?Parname5, ?Parname6, ?Parname7);", ConfigSettings.ReadSetting("main")), con);
            cmd.Parameters.Add("?Parname", MySqlDbType.Double).Value = Math.Round(deciLat, 5);
            // ... more parameters
            cmd.ExecuteNonQuery();
            client.Disconnect();
           }
4

2 回答 2

7

您只需为隧道使用与 MySQL 实例正在使用的 3306 不同的本地端口。

下面的示例使用端口 8001 代替:

using (var client = new SshClient("ssh_hostname", "ssh_username", "ssh_password"))
{
  client.Connect();
  var tunnel = new ForwardedPortLocal("127.0.0.1", 8001, "127.0.0.1", 3306);
  client.AddForwardedPort(tunnel);
  tunnel.Start();
  using (var DB = new DBContext())
  {
    //MySQL interaction here!
    scores = DB.Table
      .Where(x => !String.IsNullOrEmpty(x.SomeField))
      .ToList();
  }
  tunnel.Stop();
}

然后确保在您的连接字符串中有服务器 127.0.0.1 和端口 8001

server=127.0.0.1;port=8001

这会将任何去往 127.0.0.1:8001 的东西连接到 ssh_hostname:3306。

于 2015-01-01T23:02:40.927 回答
5

您需要使用 SSH 连接设置端口转发...

基本上建立一个 SSH 连接,侦听 localhost 上的端口 3306 并将其转发到您的 MySQL 数据库服务器...

在 MySQL DB 的连接字符串中,您需要将部分更改为server=...server=localhost而 SSH 连接需要转到 MySQL DB 服务器的 IP。

如果您无法转发端口 3306,您可以使用任何您想要的端口,但您需要另外更改连接字符串的一部分...有关具有不同端口的连接字符串的示例,port=请参见此处... SSH 连接仍以 3306 为目标但在这种情况下,在 localhost 上侦听不同的端口...

以下是一些带有源代码的工作示例(虽然不是 SSH.NET,因为我不使用 SSH.NET,但这应该让你开始 IMO):

于 2012-06-01T10:39:13.207 回答