【问题标题】:Php - Pdo Ssh TunnelPhp - Pdo SSH 隧道
【发布时间】: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 服务器连接/身份验证权限是什么?
  • 您找到解决方案了吗?

标签: php database pdo connection ssh-tunnel


【解决方案1】:

-p$sshpass ssh ssh 命令的这个特殊部分对我来说似乎有点奇怪。 -p 之后应该有一个空格,ssh 也不应该在那里。

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

【讨论】:

    【解决方案2】:

    这对我有用

    虚拟机和 VPN

    如果您有虚拟机,请先 ssh 到该虚拟机。
    如果您遇到 DNS 问题,请使用 google 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
    

    【讨论】:

      猜你喜欢
      • 2018-02-22
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-07
      • 1970-01-01
      • 2020-05-20
      相关资源
      最近更新 更多