微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过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调用.这样就可以解决问题.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐