在php中通过ssh连接mysql

fd3cxomn  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(520)

我知道关于同一件事有很多问题,但我无法解决我的问题。
我有一个只能通过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\u connect,然后得到以下响应:

errno: 0
error:

日志文件显示:

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

在google了一下之后,我发现ssh2\u 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\u主机和mysql\u主机,但它们也没有起作用。
有了我上面给出的所有数据,有人能如此明显地知道我到底需要什么才能让它工作吗?我可以仅仅通过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'
8wigbo56

8wigbo561#

这里有一种连接python和mysql的方法connector首先打开python提示符主要使用anaconda,因为它有所有内置包首先关闭所有import mysql.connector然后连接mysql像localhost用户名密码数据库然后输入sql命令插入delete search命令

w8ntj3qf

w8ntj3qf2#

根据ssh-only约束的原因,您的问题可能有多个答案。我将使用这个,因为这是我的确切用户案例:mysql服务必须只接受来自它自己的服务器或通过私有ip的连接,并且使用它的应用服务器位于同一网络上的不同机器上。
如果是这样的话,最简单的解决问题的方法就是在连接字符串中使用mysql服务器的私有ip,或者在应用服务器上用mysql服务器的私有ip的别名设置etc/host文件。
这样,您就可以像平常一样使用mysqli\u connect字符串

s5a0g9ez

s5a0g9ez3#

在运行mysql workbench的计算机上,运行一个ssh会话,转发mysql端口:

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

如果我误解了,你实际上有三台机器-一台你ssh到的,一台你ssh从的,和数据库服务器;或者如果身份验证使用外部接口(即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 client compressed protocol”,否则您会遇到明显的延迟,因为ssh连接已经被压缩。
(另外,一些ssh密码将产生比其他密码稍好的性能)。

相关问题