在远程桌面上通过SSH连接到MySql数据库时出现1042错误

时间:2015-04-23 18:38:43

标签: c# mysql ssh

我无法通过远程桌面上的SSH连接到MySql数据库。我使用C#和SshNet库。实际上,在使用SQL Manager Lite等流行工具的帮助下连接数据库没有问题,但是当我用我的工具使用相同的设置做同样的事情时 - 总是得到

  

Mysql 1042错误(无法连接到任何指定的MySQL主机)

此外,my.cnf中的部分被编辑为     bind-address = 0.0.0.0和     # skip-networking。 (是的,我尝试在bind-address上使用localhost和server ip - 同样的问题)

我还授予用户所有权限。仔细检查一下。

请看代码,也许我错过了什么。

抱歉,我正在使用表单,我只需要GUI:{

非常感谢大家。

PasswordConnectionInfo connectionInfo = new PasswordConnectionInfo("serverip", "sshlogin", "sshpass");
        connectionInfo.Timeout = TimeSpan.FromSeconds(30);
        using (var client = new SshClient(connectionInfo))
        {
            try
            {
                client.Connect();
                if (client.IsConnected)
                {
                    label1.Text = "ssh ok";
                }
                else
                {
                    label1.Text = "ssh shit";
                }

                var port = new ForwardedPortRemote(3306, "serverip", 3306);
                client.AddForwardedPort(port);
                port.Start();
                if (port.IsStarted)
                {
                    label5.Text = "port open";
                }
                else
                {
                    label5.Text = "port shit";
                }
                var conn_info = "Server=serverip;Port=3306;Database=database;Uid=remoteuser;Pwd=password;";
                bool isConn = false;
                MySqlConnection conn = null;
                try
                {
                    conn = new MySqlConnection(conn_info);
                    conn.Open();
                    isConn = true;
                }
                catch (ArgumentException a_ex)
                {

                    label3.Text = "Check the Connection String.";
                    label4.Text = a_ex.Message;
                    label5.Text = a_ex.ToString();

                }
                catch (MySqlException ex)
                {
                    string sqlErrorMessage = "Message: " + ex.Message + "\n" +
                    "Source: " + ex.Source + "\n" +
                    "Number: " + ex.Number;
                    label3.Text = sqlErrorMessage;

                    isConn = false;
                    switch (ex.Number)
                    {
                       case 1042: // Unable to connect to any of the specified MySQL hosts (Check Server,Port)
                            break;
                        case 0: // Access denied 
                            break;
                        default:
                            break;
                    }
                }
                finally
                {
                    if (conn.State == ConnectionState.Open)
                    {
                        conn.Close();
                    }
                }
                client.Disconnect();
                label2.Text = isConn.ToString();
            }
            catch (SocketException exd)
            {
                label5.Text = exd.Message;
            }

        }

2 个答案:

答案 0 :(得分:1)

在您的代码中,您正在使用var port = new ForwardedPortRemote(3306, "serverip", 3306);,它将远程计算机上的端口3306的连接转发到本地计算机上的3306。这是你想要做的吗?看起来你想要ForwardPortLocal或者调用函数来向另一个方向转发连接。

答案 1 :(得分:-1)

我遇到了同样的问题。 MySql数据库在ubuntu上运行,需要SSH连接才能连接。我从here下载了sshnet .NET 4.0库。然后,将库导入项目,遵循以下步骤:

  1. 建立ssh连接

    var client = new SshClient("ip address of linux server", "username", "password"); client.Connect();

  2. 检查客户端是否已连接。如果是,则端口转发从Linux服务器到本地服务器完成。这是一种神奇的路线。

    var portForwardedL = new ForwardedPortLocal(3306, "127.0.0.3", 3306); client.AddForwardedPort(portForwardedL); portForwardedL.Start();

  3. 现在只需使用转发的serverip和端口

    连接MySql数据库
          using (MySqlConnection con = new MySqlConnection("SERVER=127.0.0.3;PORT=3306;UID=username;PWD=password;DATABASE=database_name"))
                {
                    using (MySqlCommand com = new MySqlCommand("SELECT * FROM cities", con))
                    {
                        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());
                        }
                    }
                }
    
  4. 就是这样!它像魔术一样工作!请务必关闭ssh连接。