当前位置:  开发笔记 > 编程语言 > 正文

在PHP中通过SSH连接到MySQL服务器

如何解决《在PHP中通过SSH连接到MySQL服务器》经验,为你挑选了3个好方法。

我想通过ssh在我的mysql服务器上建立一个ssh隧道.

理想情况下,我会返回一个mysqli数据库指针,就像我直接连接一样.

我在没有SSH2库的共享主机上,但我可以使用PECL在本地安装它们.

如果有一种使用本机命令的方法会很棒.

我在想这样的事情,但如果没有这些图书馆就无法运作.

$connection = ssh2_connect('SERVER IP', 22); 

ssh2_auth_password($connection, 'username', 'password');

$tunnel = ssh2_tunnel($connection, 'DESTINATION IP', 3307);

$db = new mysqli_connect('127.0.0.1', 'DB_USERNAME', 'DB_PASSWORD', 
                         'dbname', 3307, $tunnel)
    or die ('Fail: ' . mysql_error());  

有人有主意吗?我在liquidweb上运行一个共享的CentOS linux主机.

关于使隧道持久的任何想法?是否有可能用另一个脚本建立它并只是利用它PHP

谢谢.



1> Brian C. Lan..:

我会使用autossh工具为你的mysql数据库创建一个持久的ssh隧道.然后,您在PHP代码中所要做的就是将它指向localhost.

你可以通过这样做来测试这个(没有自动重启):

ssh -L 3306:localhost:3306 user@domain.com

设置一个ssh密钥,这样你就不需要使用密码,并调整mysql系统上的.ssh/authorized_keys文件,只允许它用于端口转发.

有关ssh技巧的更多信息,请参阅Brian Hatch关于SSH和端口转发的优秀系列.



2> 小智..:

在SQL操作过程中,隧道必须保持打开状态.RJMetrics的以下示例解释了:

这是通用的SSH命令语法:

ssh -f -L bind-ip-address:bind-port:remote-ip-address:remote-port \
username@remote-server [command] >> /path/to/logfile

以下是仅使用2行PHP代码安全地建立远程数据库连接的方法:

shell_exec("ssh -f -L 127.0.0.1:3307:127.0.0.1:3306 user@remote.rjmetrics.com sleep 60 >> logfile");  
$db = mysqli_connect("127.0.0.1", "sqluser", "sqlpassword", "rjmadmin", 3307);

我们使用该shell_exec()函数创建具有60秒打开窗口的隧道,然后使用该mysqli_connect()函数使用转发端口打开数据库连接.请注意,我们必须在此使用"mysqli"库,因为mysql_connect()不允许我们指定端口,mysql_*并且不推荐使用函数.

sleep 60:当谈到隧道连接时,我们基本上有两个选择:保持连接始终打开或打开它并根据需要关闭它.我们更喜欢后者,因此我们-N在建立隧道时没有指定选项,这将使其保持打开状态,直到手动终止该过程(对自动化不利).由于-N未指定,我们的隧道将在其SSH会话未被用于任何内容时立即关闭.这是理想的行为,除了我们创建隧道和通过隧道运行MySQL连接之间的几秒钟.为了在这段时间内给我们买一些时间,我们在sleep 60创建隧道时发出无害命令,这基本上会让我们花60秒才能在隧道关闭之前通过隧道获得其他东西.只要在该时间范围内建立了MySQL连接,我们就可以了.



3> 小智..:

我通过root凭证和公共私钥对进行SSH尝试.它允许我通过命令行但不通过PHP代码.

我还通过从PHP代码创建隧道(通过使用SSH2函数),并运行外壳命令(尝试system,exec等); 没有用.

最后我尝试了SSH2函数来执行shell命令,最后工作了:)

这是我的代码,如果它可以帮助你:

$connection = ssh2_connect($remotehost, '22');
if (ssh2_auth_password($connection, $user,$pass)) {
    echo "Authentication Successful!\n";
} else {
    die('Authentication Failed...');
}


$stream=ssh2_exec($connection,'echo "select * from zingaya.users where id=\"1606\";"  | mysql');
stream_set_blocking($stream, true);
while($line = fgets($stream)) {
    flush();
    echo $line."\n";
}

如果想特别使用PHP函数,请尝试此操作.

推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有