You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Windows机器上隧道转发远程UNIX套接字连接MySQL

嘿,这个问题我刚好碰到过!我来给你拆解一下原因和解决办法:

问题根源

Windows上的Plink这类SSH工具本质上是为Windows环境设计的,而Windows本身没有UNIX套接字的概念(它用的是命名管道),所以这些工具不支持直接将远程UNIX套接字转发到本地端口——这就是和Mac上OpenSSH的核心差异,Mac用的是原生OpenSSH,对UNIX套接字的转发支持是内置的。

解决方案

我推荐两种可行的方法,优先选第一种,操作最省心:

方法1:使用Windows自带的OpenSSH客户端

现在Windows 10及以上版本已经自带了和Mac/Linux同款的OpenSSH客户端,完全支持UNIX套接字的转发,操作和你在Mac上一模一样:

  1. 先确认是否已安装:打开PowerShell,输入ssh -V,如果能看到版本信息(比如OpenSSH_for_Windows_8.6p1...)就说明没问题。如果没安装,去「设置」→「应用」→「可选功能」里添加「OpenSSH客户端」。
  2. 执行和Mac上几乎完全相同的命令:
    ssh -nNT -L 127.0.0.1:3307:/var/run/mysqld/mysqld.sock <remote_user>@<remote_ip> -p <remote_port>
    
    (把<remote_socket_path>替换成你实际的远程套接字路径,比如/var/run/mysqld/mysqld.sock
  3. 然后用本地Windows的MySQL客户端连接127.0.0.1:3307就行,比如:
    mysql -h 127.0.0.1 -P 3307 -u <db_user> -p
    

方法2:用socat在远程机器中转套接字到TCP端口(适合必须用Plink的场景)

如果因为某些原因必须用Plink,那可以在远程UNIX机器上先把套接字转成TCP端口,再做常规的端口转发:

  1. 登录远程机器,安装socat工具(大多数Linux发行版可以用包管理器装,比如Debian/Ubuntu用apt install socat,CentOS/RHEL用yum install socat)。
  2. 在远程机器上执行命令,把MySQL套接字绑定到本地TCP端口(比如3308):
    socat TCP-LISTEN:3308,reuseaddr,fork UNIX-CONNECT:/var/run/mysqld/mysqld.sock
    
    这个命令会一直运行,把发往3308端口的请求转发到MySQL的UNIX套接字上。
  3. 在Windows上用Plink做常规的TCP端口转发:
    plink -ssh -L 127.0.0.1:3307:127.0.0.1:3308 <remote_user>@<remote_ip> -P <remote_port>
    
  4. 最后本地连接127.0.0.1:3307即可。

方法3:直接让远程MySQL监听TCP端口(不推荐,除非必要)

如果远程MySQL还没开启TCP监听,可以修改它的配置文件(比如/etc/mysql/my.cnf/etc/my.cnf):

  • 找到bind-address项,改成0.0.0.0或者远程机器的公网/内网IP;
  • 确保skip-networking项被注释掉;
  • 重启MySQL服务,然后在Windows上直接用Plink转发3306端口:plink -ssh -L 127.0.0.1:3307:127.0.0.1:3306 <remote_user>@<remote_ip> -P <remote_port>
    不过这个方法需要调整MySQL的安全设置(比如给数据库用户授权远程连接、配置防火墙开放3306端口),安全性不如前两种方法,所以只推荐在信任的内网环境用。

内容的提问来源于stack exchange,提问作者Alexandr Kryuchkov

火山引擎 最新活动