我相信我(我想大多数人)在让它工作时遇到问题的原因是因为 mysql 服务器中的用户被设置为只允许来自“localhost”而不是 127.0.0.1,即 localhost 的 IP 地址。
我通过执行以下步骤使其工作:
第 1 步:允许目标用户使用 127.0.0.1 主机
SSH 正常进入您的服务器,并使用 mysql root 用户登录,然后发出命令:
GRANT ALL ON yourdbname.* TO yourdbuser@127.0.0.1 IDENTIFIED BY 'yourdbpassword';
当然,关键是在上面指定 127.0.0.1。
第 2 步:启动到 MySQL 的本地 SSH 隧道
您现在可以启动到远程 MySQL 服务器的本地 SSH 隧道,如下所示:
ssh -vNg -L 33306:127.0.0.1:3306 sshuser@remotehost.com
-v
使 ssh 以详细模式运行,这有助于查看正在发生的事情。例如,当您尝试连接时,您会在终端控制台中看到如下调试输出:
debug1: client_input_global_request: rtype hostkeys-00@openssh.com want_reply 0
debug1: Connection to port 33306 forwarding to 127.0.0.1 port 3306 requested.
关闭连接时输出如下:
debug2: channel 2: is dead
debug2: channel 2: garbage collecting
debug1: channel 2: free: direct-tcpip: listening port 33306 for 127.0.0.1 port 3306, connect from 127.0.0.1 port 52112 to 127.0.0.1 port 33306, nchannels 3
-N
使 ssh 不发出任何命令,而是在建立连接后等待。
-g
允许远程主机连接到本地转发端口。不完全确定这是否有必要,但它可能对通过同一 SSH 隧道多路复用多个连接很有用。
-L
这是主要参数,指定33306
连接远程主机的本地IP地址127.0.0.1
和远程主机的mysql端口的本地端口,通常3306
.
在此之后,您可以使用所需的任何机制/其他参数通过 SSH 连接到远程主机。在我的情况下,我使用我配置的密钥文件,~/.ssh/config
所以我只需要指定user@host
进入。
发出这样的命令会在前台运行 SSH,因此我可以使用Ctrl + C
. 如果您想在后台进程中运行此隧道,您可以添加-f
来执行此操作。
第 3 步:从 PHP/其他 mysql 兼容方法连接
在您的 localhost 上从上面运行的 SSH 隧道的行为将与您的 mysql 在127.0.0.1
. 我使用端口33306
(注意三个 3),它可以让我在其正常端口上运行我的本地 sql 服务器。您现在可以像往常一样连接。终端上的mysql
命令如下所示:
mysql -h 127.0.0.1 -P 33306 -u yourmysqluser -p
其中-P
(大写 P)指定 SSH 隧道的本地端接受连接的端口。使用127.0.0.1
IP 地址而不是localhost
因为 mysql cli 可能会尝试使用 linux 套接字进行连接,这一点很重要。
对于 PHP 连接字符串,我的数据源名称字符串(对于我的 Yii2 配置)如下所示:
'dsn' => 'mysql:host=127.0.0.1;dbname=yourdbname;port=33306',
密码和用户名按正常方式指定。