
我正在开发一个网页(ASP.NET/ C#),通过SSH在远程服务器上查询(MySQL)数据库。我正在使用这两个库(mysql-连接器-net6.9.7)和(Renci.SshNet.dll)。
我可以通过SSH连接使用远程服务器上的MySQL工作台访问MySQL数据库:
"**portal.RemoteServer.edu:22**" using "**RemoteServerUsername**" and "**RemoteServerPassword**".下面是我的C#代码,它不返回远程服务器上的客户端表中的任何数据:
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";
var auth =
new PasswordAuthenticationMethod("RemoteServerUsername", "RemoteServerPassword");
ConnectionInfo conInfo =
new ConnectionInfo("portal.RemoteServer.edu", "RemoteServerUsername", auth);
using (SshClient client = new SshClient(conInfo))
{
ForwardedPortLocal port = new ForwardedPortLocal("127.0.0.1", 0, "127.0.0.1", 22);
client.Connect();
client.AddForwardedPort(port);
port.Start();
MySqlConnection conn = new MySqlConnection(connBuilder.ConnectionString);
conn.Open();
conn.ChangeDatabase(connBuilder.Database);
var command = "SELECT * FROM DatabaseName.Clients LIMIT 10";
using (MySqlCommand cmd = new MySqlCommand(command))
{
using (MySqlDataAdapter sda = new MySqlDataAdapter())
{
cmd.Connection = conn;
sda.SelectCommand = cmd;
using (DataTable dt = new DataTable())
{
sda.Fill(dt);
GridView1.DataSource = dt;
GridView1.DataBind();
}
}
}
}发布于 2016-04-09 13:07:48
下面的大部分代码都是不言自明的。不过,我还是提出了必要的意见。我能够用下面的代码连接到MySql数据库。我使用了来自这里和MySql连接器的SSH库作为.NET。
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...");
}
}发布于 2015-09-16 09:56:26
3306),而不是SSH端口22 (这将创建一个循环)。0传递给ForwardedPortLocal的boundPort参数。这意味着操作系统会自动选择端口号。然而,您正在尝试通过固定端口MySQL连接到3306。- Either pass the fixed port `3306` to the `ForwardedPortLocal`端口=新的ForwardedPortLocal("127.0.0.1",3306,"127.0.0.1",3306);
如果本地MySQL数据库已经使用了本地3306端口,这将无法工作。当然,您可以使用任何其他本地端口(但远程端口必须是3306 )。
-或者使用port.BoundPort值(在调用port.Start()之后)用于connBuilder.Port。
port.Start();connBuilder.Port = port.BoundPort;conn =新的connBuilder.Port
确保您拥有SSH.NET库的最新版本。在旧版本中没有更新。。
注意,第一个127.0.0.1指的是本地机器(IP地址相对于本地计算机),而第二个是指服务器(IP地址相对于服务器机器)。您通常可以省略第一个参数。
https://stackoverflow.com/questions/32603982
复制相似问题