首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSH隧道上的MySQL连接

问SSH隧道上的MySQL连接
EN

Stack Overflow用户
提问于 2012-06-16 07:25:25
回答 6查看 48K关注 0票数 29

我在两个服务器(A、和B )之间建立了一个SSH隧道。B有MySQL服务器,此功能如下:

代码语言:javascript
复制
mysql -h localhost -P 3306 -u user -p

虽然这并不是:

代码语言:javascript
复制
mysql -h 127.0.0.1 -P 3306 -u user -p

尽管my.cnf有以下几行:

代码语言:javascript
复制
bind-address        = 127.0.0.1
# Next addr differs slightly, but anyway
bind-address        = 99.99.99.99

关于隧道的事。它连接如下:(A) localhost(9989) -> (B) localhost(3306),但当(在A上,通过端口转发)时,我会这样做

代码语言:javascript
复制
mysql -v -h 127.0.0.1 -P 9989 -u user userdb -p

我得到了ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0

当我做的时候

代码语言:javascript
复制
mysql -v -h localhost -P 9989 -u user userdb -p

我得到了ERROR 1045 (28000): Access denied for user 'user'@'localhost' (using password: YES)

可能是什么原因?我做错了什么?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-06-16 08:55:32

这里有三个问题。

1-暂时忘掉SSH隧道

不能将MySQL绑定到多个特定IP。第一个bind-address子句被第二个覆盖(因此被忽略)。您的服务器只监听99.99.99.99。

您可以使用-h localhost而不是-h 127.0.0.1连接的原因是,在第一种形式中,您实际上不是通过TCP/IP连接,而是通过本地套接字进行连接。

查看您的my.cnf中的socket子句。

删除一个冗余的bind-address子句。您可能希望使用bind-address=0.0.0.0,它指示MySQL守护进程侦听所有网络接口。

2-让我们设置你的SSH隧道

您错误ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0的原因对我来说并不明显。我怀疑SSH隧道实际上只有在接收到连接请求时才会建立(在您的例子中,是在运行mysql客户端时)。由于您的服务器不监听127.0.0.1 (见上一段),因此无法建立SSH隧道,连接失败,客户端将其解释为网络故障。

3-为什么mysql -v -h localhost -P 9989 -u user userdb -p失败

请张贴……的输出

[编辑:只是在下面添加了...OR host LIKE 'localhost',因为这可能与故障排除相关]

代码语言:javascript
复制
mysql > SELECT user, host FROM mysql.user WHERE user LIKE 'user' OR host LIKE 'localhost';

(必要时,用实际用户名替换'user'子句后的LIKE )

MySQL访问控制检查用户名/密码(user)和连接(host)的来源,以标识用户。您可能没有创建用户'user'@'localhost'。

注: mysql.com此时无法从我的位置到达,我无法链接到相关的手册页。

票数 31
EN

Stack Overflow用户

发布于 2013-09-25 18:13:14

我刚刚遇到了这个问题。

在我的例子中,MySQL服务器配置了bind-address: 192.168.4.4。最初,我用一个常见的-L 3306:localhost:3306 user@server字符串设置了一个SSH隧道,并从我的计算机上连接到mysql -h 127.0.0.1。

这不起作用,因为MySQL不再监听0.0.0.0甚至"localhost"(又名127.0.0.1),只监听192.168.4.4。

正确的隧道字符串应该是-L 3306:192.168.4.4:3306 user@server。这将告诉远程隧道端使用实际侦听的IP MySQL连接到MySQL。

票数 11
EN

Stack Overflow用户

发布于 2016-11-15 20:34:56

一步一步的SSH隧道

服务器端

在目标计算机(可以由IP或托管域寻址)中,配置文件/etc/mysql/my.cnf有一行

代码语言:javascript
复制
bind-address    = 127.0.0.1

用控制台确认

代码语言:javascript
复制
netstat -tapn |  grep mysql
// tcp    0    0 127.0.0.1:3306     0.0.0.0:*    LISTEN      18469/mysqld

这意味着mysql服务器将只响应来自本地主机的请求。

-客户

您有一个使用cygwin、putty或linux_shell登录的帐户(最终是ssh-key)。

代码语言:javascript
复制
ssh user_name@host_name

创建SSH隧道

代码语言:javascript
复制
ssh -f -N -L 1000:127.0.0.1:3306    user_name@host_name

这意味着,在我输入(客户端)到远程host_name:3306的机器上,从端口1000创建一个永久连接.这里的意思是远程(host_name),不应该替换为localhost单词,因为这将使unix (命名)套接字上的连接不会被IP .您将得到“ERROR 2002 (HY000):无法通过套接字'/var/run/mysql.sock‘(2)连接到本地MySQL服务器。

-f = go in背景-N = no excution

-f -N是一种nohoop -您可以关闭控制台和隧道。

--服务器端--

代码语言:javascript
复制
netstat -tapn |  grep ssh
// tcp  0  0  server_ip:22   clint_ip:port  ESTABLISHED 24915/sshd: user_name

这意味着通过shh协议有一个永久的连接。

--客户方面

代码语言:javascript
复制
mysql -h 127.0.0.1 -P 1000 -u mysql_user -pmysql_pass

现在,您的(客户端) mysql客户端被合并到远程mysql服务器.这里的127.0.0.1是客户端机器

工作台相同,heidiSQL

如何杀死隧道?

代码语言:javascript
复制
ps fax | grep ssh
kill process_id
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11061621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档