当前位置:首页 > 操作系统 > MacOs

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

我正在运行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

使用密码进行身份验证后,它可以正常工作. (当然,只要在睡眠超时之前).

但是,当我运行此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权限,但是没有运气.

谢谢您的帮助;这让我发疯.

解决方法:

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

对于睡眠问题,您可以尝试使用ssh的-N选项,该选项对隧道非常有用,并且不需要执行远程命令.尝试使用外壳程序建立隧道,然后使用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 connect调用.这样就可以解决问题.


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐