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