通过ssh隧道连接到本地的MySQL

13

我希望通过ssh隧道连接到远程MySQL,并使用具有“localhost”访问权限的用户。

我使用以下命令创建隧道:

ssh -f -N -L 33306:localhost:3306 user@remote-host

同时,这可以连接到主机:

mysql -h 127.0.0.1 -P 33306 -uuser -ppassword

The error i get is:

ERROR 1045 (28000): Access denied for user 'user'@'remote-host' (using password: YES)

问题在于用户'user'@'remote-host'(或'user'@'%')不存在,只有'user'@'localhost'存在。

是否有一种方法可以强制远程主机,在不进行服务器端修改的情况下,让其认为我来自localhost?这是我通过ssh隧道进行连接的唯一原因。


注意:

如果我想使用此命令进行连接:

mysql -h localhost -P 33306 -uuser -ppassword

我得到了这个错误:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

附加数据:

在远程服务器的/etc/hosts中,值如下:

127.0.0.1       localhost
remote-ip       remote-host

这听起来有些可疑。MySQL应该已经看到了user@127.0.0.1的流量。在建立隧道后,您能否通过telnet打开本地端口? telnet localhost 33306您应该会看到类似于<junk>q>~mysql_native_password的东西。 - Michael Berkowski
@MichaelBerkowski,它说:[ales@host ~]$ telnet localhost 33306 尝试127.0.0.1... 已连接到本地主机。 转义字符为'^]'。 4 5.0.75? *Q/5ZJBK2,W?uQv|.kS<rJ 远程主机关闭了连接。 - alesf
@MichaelBerkowski,我们的系统管理员告诉我,这里的隧道可以绕过防火墙(无需打开额外的端口),但是mysql用户'user'@'%'仍应存在。 - alesf
@alesf 你确认使用了正确的密码/用户名,并且拥有连接到数据库的权限吗? - schadr
@schadr 我怀疑我当时确实遇到了这个问题,但是我两年前问过这个问题,现在我不确定我是否解决了它。非常感谢您抽出时间回答。 - alesf
2个回答

8
创建MySQL隧道到远程主机的简单方法如下:
$ ssh -fNL TEMP_PORT:localhost:MYSQL_SERVER_PORT USER@SERVER_NAME

测试:

$ mysql -u root -p -h 127.0.0.1 -P TEMP_PORT

简直是一个绝妙的方式,通过简单的SSH隧道和良好的端口连接到MySQL。真是传奇。 - undefined

6
请注意,在Unix上,MySQL中的localhost127.0.0.1是有区别的。引用原文:

在Unix上,MySQL程序以一种特殊的方式处理主机名localhost,这种方式可能与其他基于网络的程序不同。对于连接到localhost的情况,MySQL程序会尝试使用Unix套接字文件连接到本地服务器http://dev.mysql.com/doc/refman/5.7/en/connecting.html

此外,即使您明确在命令行上指定了-P,mysql客户端也会默默地尝试使用套接字文件:

即使给出了--port或-P选项来指定端口号,也会发生这种情况。为确保客户端与本地服务器建立TCP/IP连接,请使用--host或-h来指定主机名值为127.0.0.1

实际上,使用以下命令 mysql -h localhost -P 33306 -uuser -ppassword 您只是在尝试连接到缺失的本地mysqld。
考虑到这一点,您的问题归结为连接到通过域套接字可用的远程服务器。
如果安装其他软件符合您的要求,而且“无需对服务器进行修改”,则可以按照此处所述使用socathttps://www.debian-administration.org/users/dkg/weblog/68
针对mysql,它可以按以下方式工作:
  1. 在两端上安装socat
  2. socat "UNIX-LISTEN:your_local_path/mysql.sock,reuseaddr,fork" EXEC:'ssh user@remote-host socat STDIO UNIX-CONNECT\:/your_server_path/mysql.sock"
  3. mysql -S your_local_path/mysql.sock -u user

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接