通过 SSH 隧道的 mySQL 连接字符串,无需密码
Posted
技术标签:
【中文标题】通过 SSH 隧道的 mySQL 连接字符串,无需密码【英文标题】:mySQL connection string through SSH tunnel without password 【发布时间】:2013-09-01 04:17:58 【问题描述】:我已获得对运行 mysql 的服务器的 SSH 访问权限。我的访问权限通过我的公钥进行验证,无需其他密码。
使用 Putty,我可以使用我的私钥通过 SSH 连接到服务器,通过命令行工具直接登录到 mySQL 数据库并直接运行 SQL。我希望通过 C# 服务来模拟这一点(通过 SSH 连接转发端口 3306),不幸的是,http://www.connectionstrings.com/mysql/ 中列出的所有连接字符串都需要密码。
到目前为止,我使用 MySql.Data
和 SSH.NET
的粗略代码:
PrivateKeyFile file = new PrivateKeyFile(@" [ path to private key ]");
using (var client = new SshClient(" [ server ] ", "ubuntu", file))
var port = new ForwardedPortLocal(3306, "localhost", 3306);
client.AddForwardedPort (port);
client.Connect();
var connection = new MySqlConnection(
"server=localhost;database=[database];uid=ubuntu;"
);
MySqlCommand command = connection.CreateCommand();
MySqlDataReader Reader;
command.CommandText = "select * from sample";
connection.Open();
Reader = command.ExecuteReader();
while (Reader.Read())
string thisrow = "";
for (int i = 0; i < Reader.FieldCount; i++)
thisrow += Reader.GetValue(i).ToString() + ",";
Console.Write(thisrow);
connection.Close();
client.Disconnect();
在没有SshClient
部分的情况下运行代码,与本地网络上的数据库(使用已知的用户名和密码)通信,运行良好。加入SshClient
部分,并在设置隧道后设置断点后,我可以远程登录到localhost:3306
并从mySQL 获得响应。
但是,connection.Open()
行会抛出以下错误:
使用方法“mysql_native_password”对用户“ubuntu”的主机“localhost”进行身份验证失败,并显示消息:用户“ubuntu”@“localhost”的访问被拒绝(使用密码:YES)
那么...我需要什么连接字符串?还是我错过了其他地方的一些微妙之处?
【问题讨论】:
【参考方案1】:如果从错误的主机连接,MySQL 可以拒绝登录。也许你不允许 ubuntu 从 localhost 连接?
https://dev.mysql.com/doc/refman/5.1/en/connection-access.html
【讨论】:
使用 SSH 隧道,连接似乎来自哪个服务器 - 服务器上的 sshd 不会使它们看起来来自本地主机吗? 我不确定,但看看错误,我假设确实如此。您可以在使用相同凭据运行 mysql 的机器上使用命令行登录 mysql 吗? : mysql --host=localhost --user=ubuntu 那么它可能是别的东西。由于错误,这对我来说似乎是最合乎逻辑的。目前我想不出另一种解决方案。对不起。 没问题,感谢收看。我现在看到 ssh 隧道本身是否可能是问题所在。【参考方案2】:问题原来与 SSH 隧道本身有关;使用 Putty 创建隧道并删除该行之前运行的所有代码:
var connection = new MySqlConnection(
"server=localhost;database=[database];uid=ubuntu;"
);
现在成功了。
吸取的两个教训:
如果 mySQL 不需要密码,则可以省略密码。 mySQL 的错误消息可以更加明确。【讨论】:
以上是关于通过 SSH 隧道的 mySQL 连接字符串,无需密码的主要内容,如果未能解决你的问题,请参考以下文章