2015-06-10 97 views
1

我試圖訪問只能在本地訪問的遠程MySQL數據庫(本地主機)。在PHP中通過SSH2的PDO?

我的代碼看起來是這樣的:

$connection = ssh2_connect('IP to Server', 22); 

    if (ssh2_auth_password($connection, 'User', 'Password')) { 
     echo "Authentication Successful!\n"; 
    } else { 
     die('Authentication Failed...'); 
    } 

    $tunnel = ssh2_tunnel($connection, '127.0.0.1', 3306); 

    try { 
     $this->_connection = new PDO($dsn, $config['login'], $config['password'], $flags); 
     $this->connected = true; 
     if (! empty($config['settings'])) { 
      foreach ($config['settings'] as $key => $value) { 
       $this->_execute("SET $key=$value"); 
      } 
     } 
    } catch (PDOException $e) { 
     throw new MissingConnectionException(array(
       'class' => get_class($this), 
       'message' => $e->getMessage() 
     )); 
    } 

劇本是成功的,直到$隧道。 PDO連接失敗並顯示「連接被拒絕」。我認爲PDO試圖連接到MAMP? $ dsn變量看起來像「mysql:host = 127.0.0.1; port = 3306; dbname = mydb」。

如何告訴MAMP,127.0.0.1在通過SSH連接的遠程服務器上?

謝謝!

回答

2

正如您已經提到的,您的腳本正試圖連接到您的本地MySQL服務器而不是遠程服務器。爲了讓PDO與遠程服務器建立連接,您可以建立SSH tunnel並將本地端口轉發到服務器端口。如此處所示http://brettrawlins.com/mysql-ssh-tunnel/

在PHP運行SSH命令:shell_exec(ssh code here)

你可能想看看:Connect to a MySQL server over SSH in PHP

然而,由於在那裏指出的還有,這種方法是,你必須創建一個新的隧道相對緩慢每次查詢數據庫時,都會使查詢花費更長的時間。我認爲對於開發環境來說這是一個有效的選擇,因爲你沒有static IP,但我沒有看到這個工作在生產中。

如果您爲了加密而嘗試這樣做,我會建議使用SSL連接到您的數據庫。但請注意,所有PHP版本可能不支持SSLPDO版本。

+0

謝謝 - 我認爲更穩定的解決方案將是SSL連接。 只是爲了解:SSH解決方案是否像我認爲的那樣安全?或者只是很多工作和超載? – mittererr

+0

從安全的角度來看:如果您的代碼泄漏,那麼您的SSH登錄證書將被硬編碼到其中。即使您正在使用公鑰認證,這也不是您正在尋找的內容,您應該這樣做。從實際的角度來看:如果你想加密你的數據庫流量,這就是SSL的用處。 – wittyweasel