在PHP中通过SSH连接到MySQL

时间:2018-08-31 11:42:17

标签: php mysql ssh ssh-tunnel

我知道有很多关于同一件事的问题,但我无法解决。

我有一个只能通过PuTTY或MySQL Workbench访问的数据库-它必须通过SSH连接。但是,我需要能够通过PHP使用此数据库连接,但无法使其正常工作。

以下是连接的详细信息(为安全起见,IP,用户名和密码均已更改):

<?php print_r(str_split($name)); ?>

Array ( [0] => b [1] => e [2] => n [3] => j [4] => a [5] => m [6] => i [7] => n ) 

使用PuTTY时,我连接到SSH主机,然后运行以下执行:

> 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

当尝试在PHP中连接数据库时,我很挣扎。

我最初尝试在PHP中使用SSH2函数:

> (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;

一切正常,并且打印“成功”,直到我尝试使用mysqli_connect,然后得到以下响应:

$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 />";
}

日志文件显示:

errno: 0
error: 

经过一番谷歌搜索,我最终发现SSH2_TUNNEL并没有“允许您在打开SSH隧道时指定本地端口”。不知道这是否是我的代码中的问题,我尝试继续提出其他建议,并发现了以下问题: http://chxo.com/be2/20040511_5667.html

但是,这是我在努力的地方,而且我似乎并没有把我应该代替的占位符包裹住:

mysqli_connect() expects parameter 1 to be string, resource given

我已经尝试过了,但是不起作用:

ssh -fNg -L 3307:127.0.0.1:3306 myuser@remotehost.com

我已经尝试将localhost IP更改为ssh_host和mysql_host,以防万一,它们也不起作用。

有了上面我提供的所有数据,有人能完全按照我的需要使它变得如此明显吗?我可以仅通过PHP函数执行此操作,还是需要运行命令?

EDIT

根据@LSerni的评论,我刚刚尝试运行此命令(将$ vars替换为上面的值):

ssh -fNg -L 3307:127.0.0.1:3306 ssh_user@ssh_host

但是,我现在遇到的错误是(再次,将$ var替换为上面的值):

exec("ssh -fNg -L 3306:$mysql_host:3306 $ssh_user@$ssh_host");
mysqli_connect("127.0.0.1", $mysql_user, $mysql_pass, $default);

3 个答案:

答案 0 :(得分:0)

取决于仅SSH约束的原因是什么,您的问题可能有多个答案。我将继续讨论这一问题,因为这是我的确切用户情况:MySQL服务必须仅接受来自其自己的服务器或通过私有IP的连接,并且使用它的应用服务器位于同一台机器上的不同机器上网络。

在这种情况下,解决问题并使您免于打开服务器之间隧道的麻烦的最简单方法是在连接字符串中使用MySQL服务器的专用IP或在应用程序上设置etc / host文件带有MySQL服务器专用IP别名的服务器。

那样,您可以像平常一样只使用mysqli_connect字符串

答案 1 :(得分:0)

在运行MySQL Workbench的计算机上,运行SSH会话以转发MySQL端口:

ssh -fNg -L 3306:127.0.0.1:3306 myuser@remotehost.com

如果我误解了,而您实际上有三台机器-SSH所用的计算机,SSH所用的计算机以及数据库服务器;或者如果身份验证使用 external 接口(即SSH所使用的IP和数据库服务器相同),则需要

ssh -fNg -L 3306:123.45.67.8:3306 myuser@remotehost.com

其中123.45.67.8是您的数据库服务器的地址。如果SSH和MySQL服务器都在123.45.67.8所在的计算机上,则这也适用,因为否则可能会遇到身份验证错误(user@123.45.67.8和user@127.0.0.1是两个不同的身份验证)。

现在,从同一台计算机上,您可以使用您知道的用户名和密码连接到主机127.0.0.1(“ localhost”,因为这可能被解释为Unix套接字)。在远程计算机上工作。

我刚刚在我的测试机上尝试过此方法,并且可以正常工作。

请记住不要使用“ MySQL客户端压缩协议”,否则您将遇到明显的延迟,因为SSH连接已被压缩。

(此外,某些SSH密码将产生比其他密码更好的性能)。

答案 2 :(得分:0)

这是一种将python与mysql连接器连接的方法 首先打开您的python提示符,主要使用anaconda,因为它具有所有内置包,首先关闭所有导入mysql.connector,然后 连接到mysql,例如localhost用户名密码数据库,然后输入sql命令以插入删除搜索命令