我知道关于同样的事情有很多问题,但我无法解决我的问题。
我有一个我只能通过PuTTY或MySQL Workbench访问的数据库 - 它必须通过SSH连接。但是,我需要能够通过PHP使用此数据库连接,但我无法使其正常工作。
以下是连接的详细信息(IP,用户名和密码都是为了安全而更改):
> SSH Host ($ssh_host): 123.45.67.890
> SSH User ($ssh_user): ssh_user
> SSH Pass ($ssh_pass): ssh_pass
> MySQL Host ($mysql_host): 123.12.34.123
> MySQL User ($mysql_user): mysql_user
> MySQL Pass ($mysql_pass): mysql_pass
> MySQL Server Port ($port): 3306
> Default Schema ($db): default
当我使用PuTTY时,我连接到SSH主机,然后运行以下执行:
> (asks for login): ssh_user
> (asks for password): ssh_pass
> mysql -umysql_user -h123.12.34.123 -p;
> (asks for password): mysql_pass
> \u default
> *RUN SQL QUERY HERE LIKE*: DESCRIBE table;
当尝试连接到PHP中的数据库时,我很挣扎。
我最初尝试在PHP中使用SSH2函数:
$ssh_conn = ssh2_connect($ssh_host, $port);
if ($ssh_conn) {
print "connection successful<br />";
} else {
print "connection failed<br />";
die();
}
$ssh_auth = ssh2_auth_password($ssh_conn, $ssh_user, $ssh_pass);
if ($ssh_conn) {
print "authentication successful<br />";
} else {
print "authentication failed<br />";
die();
}
$ssh_tunnel = ssh2_tunnel($ssh_conn, $mysql_host, $port);
if ($ssh_tunnel) {
print "tunnel successful<br />";
} else {
print "tunnel failed<br />";
die();
}
$mysqli = mysqli_connect($ssh_tunnel, $mysql_user, $mysql_pass, $db);
if (!$mysqli) {
print "errno: ".mysqli_connect_errno()."<br />";
print "error: ".mysqli_connect_error()."<br />";
die();
} else {
print "mysql connection successful<br />";
}
一切正常并打印“成功”,直到我尝试使用mysqli_connect然后我得到以下响应:
errno: 0
error:
日志文件显示:
mysqli_connect() expects parameter 1 to be string, resource given
经过一段谷歌搜索后,我最终发现SSH2_TUNNEL“不允许您在打开SSH隧道时指定本地端口”。不确定这是否导致我的代码中的问题,我尝试继续其他建议,并发现:http://chxo.com/be2/20040511_5667.html
然而,这是我正在努力的地方,我似乎没有把我的头脑包裹在我应该代替占位符的地方:
ssh -fNg -L 3307:127.0.0.1:3306 [email protected]
我试过这个,但它不起作用:
ssh -fNg -L 3307:127.0.0.1:3306 ssh_user@ssh_host
我已经尝试将localhost IP更改为ssh_host和mysql_host,以防万一,他们也没有工作。
根据我上面给出的所有数据,有人可以根据我的需要做出如此明显的工作吗?我可以单独通过PHP函数完成吗,还是需要运行命令?
编辑
根据@LSerni的评论,我刚尝试运行它(用上面的值替换$ vars):
exec("ssh -fNg -L 3306:$mysql_host:3306 $ssh_user@$ssh_host");
mysqli_connect("127.0.0.1", $mysql_user, $mysql_pass, $default);
但是,我现在得到的错误是(再次用上面的值替换$ var):
mysqli_connect(): (28000/1045): Access denied for user '$mysql_user'@'localhost'
根据您的SSH限制的原因,您的问题可能有多个答案。我将使用这个,因为这是我确切的用户案例:MySQL服务必须只接受来自其自己的服务器或通过私有IP的连接,并且使用它的应用服务器位于同一台机器上网络。
如果是这种情况,解决问题并避免在服务器之间打开隧道的麻烦的最简单方法是在连接字符串中使用MySQL服务器的私有IP,或者在应用服务器上设置etc / host文件MySQL服务器私有IP的别名。
这样,您可以像通常那样使用mysqli_connect字符串
从运行MySQL Workbench的机器,运行转发MySQL端口的SSH会话:
ssh -fNg -L 3306:127.0.0.1:3306 [email protected]
如果我误解了你实际上有三台机器 - 你通过SSH连接的机器,你从SSH机器和数据库服务器;或者如果身份验证使用外部接口(即您通过SSH连接的IP和数据库服务器相同),那么您需要
ssh -fNg -L 3306:123.45.67.8:3306 [email protected]
其中123.45.67.8是数据库服务器的地址。如果123.45.67.8是SSH和MySQL服务器都在的机器,这也有效,因为您可能会遇到验证错误([email protected]和[email protected]是两个不同的auths)。
现在,您可以使用您知道在远程计算机上工作的用户名和密码,从同一台计算机连接到主机127.0.0.1(不是“localhost”,因为这可能被解释为Unix套接字)。
我刚刚在我的测试机器上试过这个并且它有效。
请记住,不要使用“MySQL客户端压缩协议”,否则您将遇到明显的延迟,因为SSH连接已经被压缩。
(另外,一些SSH密码的性能会比其他密码略好)。
这是一种连接python与mysql连接器的方法首先打开你的python提示符主要使用anaconda,因为它已经在所有内置的pakages首先关闭所有导入mysql.connector然后连接到mysql就像localhost用户名密码数据库然后输入sql命令插入删除搜索命令