php - 在 PHP 中通过 SSH 连接到 MySQL

标签 php mysql ssh ssh-tunnel

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

我有一个只能通过 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 的评论,我刚刚尝试运行此命令(将 $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'

最佳答案

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

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

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

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 客户端压缩协议(protocol)”,否则您会遇到明显的延迟,因为 SSH 连接已经被压缩。

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

关于php - 在 PHP 中通过 SSH 连接到 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52114738/

相关文章:

php - 未找到任何元素 - 尽管 SQL 语句看起来不错

go - 关闭加密 ssh session 以释放 golang 中所有资源的正确方法?

php - 在 Symfony 中发布日期?

php - 无法访问cpanel,获取 “HTTP ERROR 500”

mysql - 有没有办法从 MySQL 的子选择中获取字段 => 值对?

PHP MySQL奇怪的更新问题

linux - VMAccessForLinux 无法在 Azure RM VM 上预配

docker - 为什么 dockerised SSH 服务无法启动,因为它无法加载主机 key ?

php - 从 PHP 查询返回一个数组

php - WooCommerce Rest API 在创建订单中返回无效参数 'shipping_lines'