我读了一篇关于这个主题的帖子,我也想做同样的事,
我在远程linux机器上有我的数据库,我想用ssh和php函数连接,(我目前正在使用ssh2库) 我尝试使用mysql_connect,但它让我无法访问(虽然我已经授予了权限) 当我尝试使用这个功能时:
$connection = ssh2_connect('SERVER IP', 22);
ssh2_auth_password($connection, 'username', 'password');
$tunnel = ssh2_tunnel($connection, 'DESTINATION IP', 3307);
$db = mysqli_connect('127.0.0.1', 'DB_USERNAME', 'DB_PASSWORD',
'dbname', 3307, $tunnel)
or die ('Fail: '.mysql_error());
我收到错误“mysqli_connect()期望参数6为字符串,资源给定”,有谁可以帮我这个
答案 0 :(得分:33)
试试这个:
第1步。
在remotehost.com上设置与MySQL服务器的隧道SSH连接
ssh -fNg -L 3307:127.0.0.1:3306 myuser@remotehost.com
这里的关键是-L,它表示我们正在进行本地端口转发。
本地端口Frowarding语法
语法有点棘手但可以看作:
<local_port>:<server_addr_remote_end>:<server_port_remote_end> myuser@proxy.com
如果您对其他开关感兴趣,它们是: -f(转到后台) -N(不执行远程命令) -g(允许远程主机连接到本地转发端口)
公钥认证,添加(-i)切换到上面:
-i / path / to / public / key
第2步。
现在告诉本地MySQL客户端通过步骤1中的SSH隧道设置连接到您计算机上的端口3307(通过ssh转发,连接到remotehost.com上的“127.0.0.1:3306”)。
mysql -h 127.0.0.1 -P 3307 -u dbuser -p passphrase
客户端和服务器之间的数据交换现在通过加密的ssh连接发送,并且是安全的。
第3步。
现在将您的PHP应用程序连接到:
<?php
$smysql = mysql_connect( "127.0.0.1:3307", "dbuser", "passphrase" );
mysql_select_db( "db", $smysql );
?>
感谢Chris Snyder在http://chxo.com/be2/20040511_5667.html
上发表的精彩文章GUI工具
根据您的要求,另一种方法是使用具有SSH隧道支持的GUI MySQL客户端,例如http://www.sequelpro.com/,或使用PuTTY设置端口转发。
更新1 今天,我回顾了一个名为secure pipes的可行替代macOS GUI ssh隧道工具,您可能会发现它很有用。
答案 1 :(得分:1)
根据the docs,最后一个参数应该是套接字或管道名称,类似于'/var/run/mysql/mysql.sock'。由于您没有使用UNIX套接字进行连接,因此不适用于您...所以请尝试将其删除。
答案 2 :(得分:1)
不幸的是,php提供的ssh2隧道似乎无法处理远程mysql连接,因为您无法将本地端口指定为隧道(它仅适用于端口22或运行远程服务器的任何ssh端口)。我的解决方案是通过exec()
运算符打开隧道,并照常连接:
exec('ssh -f -L 3307:127.0.0.1:3306 user@example.com sleep 10 > /dev/null');
$mysqli = new mysqli('127.0.0.1', 'user', 'password', 'database', '3307');
答案 3 :(得分:1)
我一直在寻找相同的东西,但是我更不想不需要外部命令和管理外部流程。所以在某个时候,我想写一个可以在任何PHP流上运行的纯PHP MySQL客户端有多难?根据MySQL协议文档,我花了大约半天的时间。
https://gist.github.com/UCIS/4e509915ed221660e58f5169267da004
您可以将其与SSH2库或任何其他流一起使用:
$ssh = ssh2_connect('ssh.host.com');
ssh2_auth_password($ssh, 'username', 'password');
$stream = ssh2_tunnel($ssh, 'localhost', 3306);
$link = new MysqlStreamDriver($stream, 'SQLusername', 'SQLpassword', 'database');
$link->query('SELECT * FROM ...')->fetch_assoc();
它没有实现完整的mysqli API,但是它可以与所有纯文本查询一起使用。如果您决定使用此代码,请当心,我尚未对代码进行彻底的测试,并且字符串转义代码尚未经过审查。
答案 4 :(得分:0)
即使我通过root凭据和公共私钥对执行ssh尝试它,但它允许我通过命令行但不通过PHP代码。我尝试创建隧道(通过使用ssh2函数),从PHP代码(系统,exec等)运行shell命令,没有任何工作。最后我尝试了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函数,我可以尝试这个。
答案 5 :(得分:0)
确保您要连接的用户名和密码具有正确的主机名权限。我相信你可以使用'%'作为通配符。此外,如果您连接到远程计算机(我认为您是在尝试ssh进入它),而不是在本地网络上,您将必须转发路由器上的服务器用于外部流量的端口能够连接到它。
答案 6 :(得分:0)
我相信我(和我想大多数人)之所以有这个问题的原因是因为mysql服务器中的用户设置为只允许来自“localhost”而不是127.0.0.1,即IP地址本地主机。
我通过执行以下步骤来实现此目的:
SSH正常进入您的服务器,并使用mysql root用户登录,然后发出命令:
GRANT ALL ON yourdbname.* TO yourdbuser@127.0.0.1 IDENTIFIED BY 'yourdbpassword';
当然,关键是指定上面的127.0.0.1。
您现在可以启动到远程MySQL服务器的本地SSH隧道,如下所示:
ssh -vNg -L 33306:127.0.0.1:3306 sshuser@remotehost.com
-v
使ssh以详细模式运行,这有助于查看正在发生的事情。例如,当您尝试连接时,您将在终端控制台中看到这样的调试输出:
debug1: client_input_global_request: rtype hostkeys-00@openssh.com want_reply 0
debug1: Connection to port 33306 forwarding to 127.0.0.1 port 3306 requested.
并在关闭连接时输出如下:
debug2: channel 2: is dead
debug2: channel 2: garbage collecting
debug1: channel 2: free: direct-tcpip: listening port 33306 for 127.0.0.1 port 3306, connect from 127.0.0.1 port 52112 to 127.0.0.1 port 33306, nchannels 3
-N
使ssh不发出命令,只是在建立连接后等待。
-g
允许远程主机连接到本地转发端口。不完全确定是否有必要,但它可能对通过同一SSH隧道多路复用多个连接很有用。
-L
这是主要参数,指定连接到远程主机的本地IP地址33306
的本地端口127.0.0.1
和远程主机的mysql端口,通常是3306
您可以使用此后所需的任何机制/其他参数通过SSH连接到远程主机。在我的情况下,我使用在~/.ssh/config
中配置的密钥文件,因此我只需指定user@host
即可进入。
发出这样的命令会在前台运行SSH,因此我可以使用Ctrl + C
轻松关闭它。如果要在后台进程中运行此隧道,可以添加-f
来执行此操作。
在本地主机上从上面运行的SSH隧道的行为就像你的mysql在127.0.0.1
上运行一样。我使用端口33306
(注意三重3),它允许我在其正常端口运行我的本地SQL服务器。您现在可以像平常一样进行连接。终端上的mysql
命令如下所示:
mysql -h 127.0.0.1 -P 33306 -u yourmysqluser -p
其中-P
(大写P)指定SSH隧道本地端接受连接的端口。使用127.0.0.1
IP地址而不是localhost
很重要,因为mysql cli会尝试使用linux套接字进行连接。
对于PHP连接字符串,我的数据源名称字符串(对于我的Yii2配置)如下所示:
'dsn' => 'mysql:host=127.0.0.1;dbname=yourdbname;port=33306',
密码和用户名被指定为正常。