【发布时间】: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 还是没有什么好的使用方法
标签: php mysql ssh ssh-tunnel