Php - Pdo Ssh Tunnel


Php - Pdo Ssh Tunnel

现在我正在创建一个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

这对我很有效

虚拟机和VPN

如果您有一个虚拟机,那么首先ssh到该虚拟机
如果您遇到DNS问题,请使用谷歌DNS:sudo nano /etc/resolv.conf127…更改为8.8.8.8

我的隧道需要我通过vpn连接,我使用了openvpn,你可以这样安装:

sudo yum -y install openvpn

连接到vpn从vpn提供商下载myconfig.ovpn

sudo openvpn --config myconfig.ovpn 

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

-p$sshpass ssh ssh命令的这个特定部分对我来说有点奇怪。-p后面可能应该有一个空格,而ssh也不应该在那里。

此外,-p选项用于端口,而不是密码。