gpt4 book ai didi

php - 通过 SSH 将 MySQL 绑定(bind)到本地端口 - 在控制台中工作,而不是通过 Mac OSX 中的 PHP shell_exec()

转载 作者:可可西里 更新时间:2023-11-01 08:21:40 25 4
gpt4 key购买 nike

我正在运行 OSX 10.6.7 并尝试通过 ssh 连接到远程 MySQL 服务器以运行一些 PHP 脚本。目前,我可以毫无问题地运行以下命令:

ssh -i /Users/xxxx/key.pem user@data.server.com -L 53306:localhost:3306 -f sleep 60 >> logfile
mysql -u user -p -h 127.0.0.1 -P 53306

在我使用密码进行身份验证后,它可以完美运行。 (当然,只要在 sleep 超时之前。)

但是当我运行这个 PHP 脚本时...

$shell = shell_exec("ssh -i /Users/xxxx/key1.pem user@data.server.com -L 53306:localhost:3306 -f sleep 60 >> logfile");

$mysqli = mysqli_connect('127.0.0.1', 'user', 'password', 'database', 53306);

我收到拒绝连接。当我省略 shell_exec() 时,我得到同样的错误。当我回显 $shell 时,没有任何输出。

key1.pem 有 chmod 400 权限,是 key.pem 的副本,我在上面运行了 chown_www。如果我尝试使用 key.pem 或 key1.pem,我会遇到同样的错误。我也尝试了 440 权限,但没有成功。

感谢您的帮助;这让我抓狂。

最佳答案

如果您使用的是私钥,为什么还需要密码?你的意思是 key 文件的密码?我认为这可能是问题所在,因为 ssh 仅在 tty 和 php *exec 函数中接受使用密码的身份验证。

sleep 问题可以试试ssh的-N选项,这对隧道很有用,而且不需要执行远程命令。尝试使用 shell 建立隧道,然后使用 php 简单地连接到该隧道。

更新:

我试过了,它在我的 Mac 上确实有效

<?
exec('ssh -f -N -n -L 5500:localhost:3306 your-host-name &> /dev/null');
var_dump(mysql_connect('127.0.0.1:5500', 'root'));

您应该添加您的 -i 选项并替换您的主机名。

这是我电脑上的输出

resource(9) of type (mysql link)

但是请记住,您会遇到一些问题。 &>/dev/null 语句使 exec 函数立即返回,但是当你多次执行脚本时它会抑制任何输出(主要是错误),因为每个新请求都会尝试打开一个新的连接,它将成功但无法设置隧道,因为端口 5500 已被使用。一段时间后,您的计算机上将有大量 ssh 进程挂起。

为避免这种情况,您应该尝试在 ssh 调用之前连接到 mysql,如果不能,则设置隧道并重做 mysql 连接调用。这样就可以解决问题了。

关于php - 通过 SSH 将 MySQL 绑定(bind)到本地端口 - 在控制台中工作,而不是通过 Mac OSX 中的 PHP shell_exec(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6541688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com