在 PHP 中通过 SSH 连接到 MySQL

Posted

技术标签:

【中文标题】在 PHP 中通过 SSH 连接到 MySQL【英文标题】:Connecting to MySQL via SSH in PHP 【发布时间】:2019-02-06 10:39:32 【问题描述】:

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

我有一个只能通过 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 myuser@remotehost.com

我试过了,但它不起作用:

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

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

根据我上面提供的所有数据,有人能如此明确地知道我需要什么才能使其正常工作吗?我可以仅通过 PHP 函数来完成,还是需要运行命令?

编辑

根据@LSerni 的 cmets,我刚刚尝试运行它(将 $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'

【问题讨论】:

你解决过这个问题吗? php / ssh 和 mysql 还是没有什么好的使用方法 【参考方案1】:

在您运行 MySQL Workbench 的机器上,运行一个转发 MySQL 端口的 SSH 会话:

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

如果我误解了你实际上有三台机器——你通过 SSH 连接的一台、你从 SSH 连接的一台以及数据库服务器;或者如果身份验证使用 external 接口(即您 SSH 连接的 IP 和 DB 服务器相同),那么您需要

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

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

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

我刚刚在我的测试机器上试过这个,它可以工作。

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

(此外,某些 SSH 密码的性能会比其他密码稍好)。

【讨论】:

我在本地机器上运行 MySQL Workbench,但我的代码在远程服务器上。当我从远程服务器运行此代码时,出现以下错误:“errno: 1045 error: Access denied for user 'mysql_user'@'localhost' (using password: YES)” 您使用什么作为 Workbench 的连接主机?顺便说一句,在上面的代码中,我刚刚注意到你有“$shh_tunnel”而不是“$ssh_tunnel”。是错字还是错误? 是的,这绝对是一个错字,对不起! MySQL Workbench 连接信息在上面的第一个代码块中,我从那里复制了它 好的,已编辑答案。如果 SSH 和 MySQL 服务器相同,通常应该使用 127.0.0.1。但是,请尝试在 SSH2 连接字符串中使用远程 MySQL IP 地址(我已在答案中解释了原因)。 我刚刚用我刚刚尝试过的内容更新了我的帖子 - 不确定我是否在正确的地方使用了正确的 IP...【参考方案2】:

根据您的仅限 SSH 限制的原因是什么,您的问题可能有多个答案。我将使用这个,因为这是我的确切用户案例:MySQL 服务必须只接受来自其自己的服务器或通过私有 IP 的连接,并且使用它的应用程序服务器位于同一台机器上的不同机器上网络。

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

这样,你可以像平常那样只使用 mysqli_connect 字符串

【讨论】:

不确定这是否是您所指的,但我们已经为运行代码的远程服务器添加了 IP,以允许访问数据库服务器。我获得的唯一 IP 是我正在尝试使用的 IP…… 需要这样做的原因是什么? mysql 用户$mysql_user 是否配置为只接受来自本地主机的连接? 说实话我不知道,我只知道我们有一个防火墙管理器,它允许某些 IP 访问我们服务器上的 IP(不幸的是,我不是那么技术)跨度> 【参考方案3】:

这里有一种连接python和mysql连接器的方法 首先打开你的python提示主要使用anaconda,因为它首先包含所有内置的包,然后导入mysql.connector 像localhost一样连接mysql用户名密码数据库然后输入sql命令插入删除搜索命令

【讨论】:

您好,请在您的键盘上找到. 和“Enter”按钮并使用它们;-) 您的回答可能很好,但现在很难阅读。跨度> 感谢您的回复。但是,我使用的是 PHP,我的问题有点复杂,感谢只是连接 :)

以上是关于在 PHP 中通过 SSH 连接到 MySQL的主要内容,如果未能解决你的问题,请参考以下文章

在 Netbeans 中通过 SSH 连接到 MySql db

在 Java 中通过 SSH 隧道连接到 Mongo 数据库

用于从该框中通过 SSH 连接到 jumphost 和 sftp 的 Python 脚本

在 Linux 中通过 SSH 连接到 Amazon EC2

在 Android 中通过 XAMPP 连接到 MYSQL

在IIS7中通过PHP连接到SQL SERVER 2008(使用Windows身份验证)?