Php - Pdo SSH 隧道
Posted
技术标签:
【中文标题】Php - Pdo SSH 隧道【英文标题】:Php - Pdo Ssh Tunnel 【发布时间】:2016-08-26 22:02:49 【问题描述】:现在我正在创建一个 ssh 隧道,所以我可以连接到我的远程数据库,但由于某种原因连接仍然拒绝... 我的脚本:
try
$host = 'remote host';
$sshuser = 'ssh user';
$sshpass = 'ssh password';
$dbuser = 'db user';
$dbpass = 'db user';
$dbname = 'db name';
shell_exec("ssh -p$sshpass ssh -o StrictHostKeyChecking=no -f -L 3307:127.0.0.1:3306 $sshuser@$host");
$dbh = new PDO('mysql:host=127.0.0.1;port=3307;dbname=' .$dbname. '', $dbuser, $dbpass);
$sth = $dbh->prepare("SELECT * from table");
$sth->execute();
$result = $sth->fetchAll();
print_r ($result);
shell_exec("kill $(ssh-pid)");
$dbh = null;
catch (PDOException $e)
print "Error!: " . $e->getMessage() . "<br/>";
die();
结果我得到:
Error!: SQLSTATE[HY000] [1130] Host 'host' is not allowed to connect to this MySQL server
【问题讨论】:
ssh 隧道是否保持活动状态?数据库服务器是否已经在端口 3307 上本地运行?该用户真正的 MySQL 服务器连接/身份验证权限是什么? 您找到解决方案了吗? 【参考方案1】:-p$sshpass ssh
ssh 命令的这个特殊部分对我来说似乎有点奇怪。 -p
之后应该有一个空格,ssh
也不应该在那里。
另外,-p
选项用于端口,而不是密码。
【讨论】:
【参考方案2】:这对我有用
虚拟机和 ***
如果您有虚拟机,请先 ssh 到该虚拟机。
如果您遇到 DNS 问题,请使用 google dns:sudo nano /etc/resolv.conf
将127…
更改为8.8.8.8
我的隧道需要我通过***连接,我用的是open***,你可以这样安装:
sudo yum -y install open***
连接到*** 从 *** 提供商处下载 myconfig.o***
sudo open*** --config myconfig.o***
SSH 密钥
将您的密钥上传到虚拟机 修复权限
sudo chmod 600 ~/.ssh/my-private-ssh-key
端口转发
ssh -f -N -i ~/.ssh/my-private-ssh-key yourname@yoursshserverdomain.com -L 3307:yourmysqldbdomain.com:3306
-f
将在后台运行它-L
将转发127.0.0.1:3307
以指向yourmysqldbdomain.com:3306
请注意,在我的情况下使用 localhost
不起作用,必须使用 127.0.0.1
作为当前虚拟机本地 IP。
您可以删除-f
和-L
条件,而是添加-v
来进行一些调试,就像这样
ssh -v -i ~/.ssh/my-private-ssh-key yourname@yoursshserverdomain.com
连接mysql
mysql -u yourdbusername -h 127.0.0.1 -P 3307 -p
连接 PHP PDO
$db_server = '127.0.0.1';
$db_port = '3307';
$db_name = 'yourdbname';
$db_user = 'yourdbusername';
$db_pass = 'yourdbpassword';
$dsn = 'mysql:host='.$db_server.';dbname='.$db_name.';port='.$db_port;
$driver_options = [
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'",
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_TIMEOUT => 5, // timeout in seconds
];
$pdo = new PDO($dsn, $db_user, $db_pass, $driver_options);
移除端口转发
完成后,您可以通过查找 id 来终止进程,如下所示:
ps aux | grep ssh
sudo kill 123123 // replace 123123 with the id of the process
【讨论】:
以上是关于Php - Pdo SSH 隧道的主要内容,如果未能解决你的问题,请参考以下文章