使用 SSH.NET 库通过 SSH 连接到 MySQL

Posted

技术标签:

【中文标题】使用 SSH.NET 库通过 SSH 连接到 MySQL【英文标题】:SSH connection to MySQL using SSH.NET library 【发布时间】:2012-06-04 12:51:54 【问题描述】:

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

这里是库的LINK,很多人会觉得这很有趣,因为您不需要手动打开 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 通道然后执行我的查询呢?

我需要将我的代码放在 connectdisconnect 函数中吗?

还有人认为我在引用中添加了 .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();
           

【问题讨论】:

您可能应该使用库将远程转发到本地端口并在您的连接字符串中使用它。 【参考方案1】:

您只需为隧道使用与 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。

【讨论】:

这很好用,非常好。不过,每次都需要打开吗?我只能打开一次吗?【参考方案2】:

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

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

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

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

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

http://georgelantz.com/2007/09/10/access-mysql-through-ssh-tunnel-in-a-windows-net-application/ http://www.howtogeek.com/howto/ubuntu/access-your-mysql-server-remotely-over-ssh/(这只是关于如何从命令行使用本地 SSH 客户端进行设置的一个选项)

【讨论】:

嗨,感谢您的尝试,但我已经尝试了所有这些。请一直阅读我的问题。我写了关于端口转发的文章 我只需要在传递 SSH 连接时结合 SSH.NET @denonth 您不能使用任何 SSH 连接... SSH 连接必须设置为端口转发连接,并且您需要更改 MySQL 连接字符串 - 否则它将无法工作。 @denonth 如果您无法转发端口 3306,您可以使用任何您想要的端口,但您需要另外更改连接字符串的 port= 部分... 我已经在第一个链接上试用了您的应用程序。我无法获得身份验证,我什至在该页面的底部写了帖子。我将本地端口设置为 3307,因为我使用的是 3306,但我无法获得身份验证。顺便提一句。有人告诉我,我不能在 3306 上拥有一个本地端口,该端口将在 3307 上拥有本地数据库和转发端口,因为这 2 不能一起工作。我需要一个本地数据库和一个服务器。我不会使用 php,因为我需要每 5-7 秒快速保存一次

以上是关于使用 SSH.NET 库通过 SSH 连接到 MySQL的主要内容,如果未能解决你的问题,请参考以下文章

SSH.NET - 消息类型 80 无效

使用 SSH.NET 连接到 OpenSSH 7.4p1 失败并显示“服务器响应在位置包含空字符”但在 WinSCP 中有效

使用 Net::OpenSSH 和 Solaris SSH 客户端的“错误配置选项:ServerAliveInterval”

AWS EC2 通过Linux终端:使用ssh连接到Linux实例

如何通过 SSH 连接向 Telnet 发送命令

通过安全连接使用 Redis