我相信我(我想大多数人)在让它工作时遇到问题的原因是因为 mysql 服务器中的用户被设置为只允许来自“localhost”而不是 127.0.0.1,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',
密码和用户名按正常方式指定。