【问题标题】:Connect to MySQL via ssh tunnel to localhost通过 ssh 隧道连接到 MySQL 到 localhost
【发布时间】:2018-03-02 19:42:30
【问题描述】:

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

我用这个做隧道:

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

这个连接到主机:

mysql -h 127.0.0.1 -P 33306 -uuser -ppassword

我得到的错误是:

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

问题是用户'user'@'remote-host'(或'user'@'%')不存在,只有'user'@'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
  • @MichaelBerkowski 它说:[ales@host ~]$ telnet localhost 33306 Trying 127.0.0.1... 已连接到 localhost。转义字符是 '^]'。 4 5.0.75? *Q/5ZJBK2,W?uQv|.kS
  • @MichaelBerkowski 我们的系统管理员告诉我,这里的隧道对于绕过防火墙很有用(无需打开其他端口),但 mysql 用户 'user'@'%' 应该仍然存在。跨度>
  • @alesf 您是否确认您使用了正确的密码/用户名并且您有权连接到数据库?
  • @schadr 我怀疑我做到了,但两年多前我问过这个问题,我真的不知道我是如何解决的,或者我根本不知道。感谢您抽出宝贵时间。

标签: mysql ssh localhost tunnel


【解决方案1】:

创建 MySQL Tunnel 到 REMOTE HOST 的简单方法:

$ ssh -fNL TEMP_PORT:localhost:MYSQL_SERVER_PORT USER@SERVER_NAME

测试:

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

【讨论】:

    【解决方案2】:

    请注意 localhost127.0.0.1 在 mysql on unix 中的处理方式不同。 引用:

    在 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

    考虑到这一点,您的问题归结为通过域套接字连接到可用的远程服务器。

    如果安装附加软件满足您的要求“无需修改服务器端”,您可以使用socat,如下所述: https://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

    【讨论】:

      猜你喜欢
      • 2014-03-21
      • 2018-10-06
      • 2016-11-18
      • 2021-11-13
      • 2012-06-19
      • 2020-09-30
      • 1970-01-01
      相关资源
      最近更新 更多