SSH使用C#建立MySQL连接的隧道 [英] SSH tunneling a MySQL connection using C#
问题描述
我试图使用SSH隧道通过C#访问我的MySQL数据库,但出现异常
I was trying to use SSH tunneling to access my MySQL database using C# but I'm getting an exception
无法连接到任何指定的MySQL主机.
Unable to connect to any of the specified MySQL hosts.
我借助以下代码获得了此代码:
到MySQL服务器的C#SSH隧道
I got this code with the help of this:
C# SSH tunnel to MySQL server
这是我的代码:
PasswordConnectionInfo connectionInfo = new PasswordConnectionInfo("example.com", 2222, "username", "password");
connectionInfo.Timeout = TimeSpan.FromSeconds(30);
using (var client = new SshClient(connectionInfo))
{
try
{
Console.WriteLine("Trying SSH connection...");
client.Connect();
if (client.IsConnected)
{
Console.WriteLine("SSH connection is active: {0}", client.ConnectionInfo.ToString());
}
else
{
Console.WriteLine("SSH connection has failed: {0}", client.ConnectionInfo.ToString());
}
Console.WriteLine("\r\nTrying port forwarding...");
var portFwld = new ForwardedPortLocal(IPAddress.Loopback.ToString(),2222, "example.com", 3306);
client.AddForwardedPort(portFwld);
portFwld.Start();
if (portFwld.IsStarted)
{
Console.WriteLine("Port forwarded: {0}", portFwld.ToString());
Console.WriteLine("\r\nTrying database connection...");
DBConnect dbConnect = new DBConnect("127.0.0.1", "database", "username", "password", "3306");
int id = dbConnect.Count("table");
MessageBox.Show(id + " count ");
}
else
{
Console.WriteLine("Port forwarding has failed.");
}
}
catch (SshException ex)
{
Console.WriteLine("SSH client connection error: {0}", ex.Message);
}
catch (System.Net.Sockets.SocketException ex1)
{
Console.WriteLine("Socket connection error: {0}", ex1.Message);
}
}
private MySqlConnection connection;
private string server;
public string Server
{
get
{
return this.server;
}
set
{
this.server = value;
}
}
private string database;
public string Database
{
get
{
return this.database;
}
set
{
this.database = value;
}
}
private string uid;
public string Uid
{
get
{
return this.server;
}
set
{
this.server = value;
}
}
private string password;
public string Password
{
get
{
return this.password;
}
set
{
this.password = value;
}
}
private string port;
public string Port
{
get
{
return this.port;
}
set
{
this.port = value;
}
}
//Constructor
public DBConnect(string server, string database, string uid, string password, string port = "3306")
{
this.server = server;
this.database = database;
this.uid = uid;
this.password = password;
this.port = port;
Initialize();
}
//Initialize values
private void Initialize()
{
string connectionString;
connectionString = "SERVER=" + server + ";" + "DATABASE=" + database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";";
connection = new MySqlConnection(connectionString);
}
//open connection to database
private bool OpenConnection()
{
try
{
connection.Open();
Console.WriteLine("MySQL connected.");
return true;
}
catch (MySqlException ex)
{
//When handling errors, you can your application's response based on the error number.
//The two most common error numbers when connecting are as follows:
//0: Cannot connect to server.
//1045: Invalid user name and/or password.
switch (ex.Number)
{
case 0:
Console.WriteLine("Cannot connect to server. Contact administrator");
break;
case 1045:
Console.WriteLine("Invalid username/password, please try again");
break;
default:
Console.WriteLine("Unhandled exception: {0}.", ex.Message);
break;
}
return false;
}
}
//Close connection
private bool CloseConnection()
{
try
{
connection.Close();
return true;
}
catch (MySqlException ex)
{
Console.WriteLine(ex.Message);
return false;
}
}
//Count statement
public int Count(string tableName)
{
string query = "SELECT Count(*) FROM " + tableName;
int Count = -1;
//Open Connection
if (this.OpenConnection() == true)
{
//Create Mysql Command
MySqlCommand cmd = new MySqlCommand(query, connection);
//ExecuteScalar will return one value
Count = int.Parse(cmd.ExecuteScalar() + "");
//close Connection
this.CloseConnection();
return Count;
}
return Count;
}
我在控制台中得到的输出是:
The output that I got in my console is:
Trying SSH connection...
A first chance exception of type 'System.ObjectDisposedException' occurred in mscorlib.dll
A first chance exception of type 'System.ObjectDisposedException' occurred in System.dll
SSH connection is active: Renci.SshNet.PasswordConnectionInfo
Trying port forwarding...
Port forwarded: Renci.SshNet.ForwardedPortLocal
A first chance exception of type 'Renci.SshNet.Common.SshConnectionException' occurred in Renci.SshNet.dll
Trying database connection...
A first chance exception of type 'System.Net.Sockets.SocketException' occurred in System.dll
A first chance exception of type 'System.Net.Sockets.SocketException' occurred in MySql.Data.dll
A first chance exception of type 'MySql.Data.MySqlClient.MySqlException' occurred in MySql.Data.dll
A first chance exception of type 'MySql.Data.MySqlClient.MySqlException' occurred in MySql.Data.dll
Error: 0 : Unable to connect to any of the specified MySQL hosts.
A first chance exception of type 'MySql.Data.MySqlClient.MySqlException' occurred in MySql.Data.dll
A first chance exception of type 'MySql.Data.MySqlClient.MySqlException' occurred in MySql.Data.dll
Unhandled exception: Unable to connect to any of the specified MySQL hosts..
更新:
我已将端口转发设置更改为:
UPATE:
I have changed the port forwarding settings to :
var portFwld = new ForwardedPortLocal("127.0.0.1", 1000, "127.0.0.1", 3306);
并且我将mySQL字符串更改为:
and I have changed my mySQL String to :
connectionString = "server=127.0.0.1;port=1000; UID=username; password=password; database=data1; charset=utf8;Allow User Variables=True";
我正在连接到ssh,并且端口已转发,但仍然无法连接到MySQL数据库,但出现异常:
I'm being connected to the ssh and my port is forwarded but I still can't connect to MySQL database, I'm getting an exception:
A first chance exception of type 'System.IO.EndOfStreamException' occurred in MySql.Data.dll
A first chance exception of type 'MySql.Data.MySqlClient.MySqlException' occurred in MySql.Data.dll
A first chance exception of type 'MySql.Data.MySqlClient.MySqlException' occurred in MySql.Data.dll
Error: 0 : Reading from the stream has failed.
推荐答案
您必须将MySQL连接到转发的绑定端口. IE.到2222.
You have to connect the MySQL to the bound port of the forwarding. I.e. to the 2222.
或者在语义上更正确,请使用portFwld.BoundPort
.等效地,使用portFwld.BoundHost
.
Or even more semantically correct, use portFwld.BoundPort
. Equivalently, use portFwld.BoundHost
.
DBConnect dbConnect = new DBConnect(portFwld.BoundHost, "database", "username", "password", portFwld.BoundPort);
还请注意,将MySQL主机称为"localhost",而不是"example.com",因为主机名是在服务器端解析的.在服务器端时,通常不会连接到"example.com",而会连接到"localhost".
Also note that it makes more sense to refer to the MySQL host as "localhost", rather than the "example.com", as the hostname is resolved on the server-side. And when on the server side, you typically won't connect to "example.com", but to a "localhost".
var portFwld = new ForwardedPortLocal(IPAddress.Loopback.ToString(), 2222, "localhost", 3306);
当然,当需要隧道时,您需要保持SSH会话打开.因此,您必须在using
块内连接到数据库:
And of course you need to keep the SSH session open while you need the tunnel. So you have to connect to the DB within the using
block:
using (var client = new SshClient(connectionInfo))
{
...
client.Connect();
...
portFwld.Start();
...
DBConnect dbConnect = new DBConnect(portFwld.BoundHost, "database", "username", "password", portFwld.BoundPort);
}
这篇关于SSH使用C#建立MySQL连接的隧道的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!