簡體   English   中英

在PHP中通過SSH連接到MySQL

[英]Connecting to MySQL via SSH in PHP

我知道有很多關於同一件事的問題,但我無法解決。

我有一個只能通過PuTTY或MySQL Workbench訪問的數據庫-它必須通過SSH連接。 但是,我需要能夠通過PHP使用此數據庫連接,但無法使其正常工作。

這是連接的詳細信息(為安全起見,IP,用戶名和密碼均已更改):

> SSH Host ($ssh_host): 123.45.67.890
> SSH User ($ssh_user): ssh_user
> SSH Pass ($ssh_pass): ssh_pass
> MySQL Host ($mysql_host): 123.12.34.123
> MySQL User ($mysql_user): mysql_user
> MySQL Pass ($mysql_pass): mysql_pass
> MySQL Server Port  ($port): 3306
> Default Schema ($db): default

使用PuTTY時,我連接到SSH主機,然后運行以下執行:

> (asks for login): ssh_user
> (asks for password): ssh_pass
> mysql -umysql_user -h123.12.34.123 -p;
> (asks for password): mysql_pass
> \u default
> *RUN SQL QUERY HERE LIKE*: DESCRIBE table;

當嘗試連接到PHP中的數據庫時,我很掙扎。

我最初嘗試在PHP中使用SSH2函數:

$ssh_conn = ssh2_connect($ssh_host, $port);
if ($ssh_conn) {
    print "connection successful<br />";
} else {
    print "connection failed<br />";
    die();
}

$ssh_auth = ssh2_auth_password($ssh_conn, $ssh_user, $ssh_pass);
if ($ssh_conn) {
    print "authentication successful<br />";
} else {
    print "authentication failed<br />";
    die();
}

$ssh_tunnel = ssh2_tunnel($ssh_conn, $mysql_host, $port);
if ($ssh_tunnel) {
    print "tunnel successful<br />";
} else {
    print "tunnel failed<br />";
    die();
}

$mysqli = mysqli_connect($ssh_tunnel, $mysql_user, $mysql_pass, $db);
if (!$mysqli) {
    print "errno: ".mysqli_connect_errno()."<br />";
    print "error: ".mysqli_connect_error()."<br />";
    die();
} else {
    print "mysql connection successful<br />";
}

一切正常,並且打印“成功”,直到嘗試使用mysqli_connect,然后得到以下響應:

errno: 0
error: 

日志文件顯示:

mysqli_connect() expects parameter 1 to be string, resource given

經過一番谷歌搜索,我最終發現SSH2_TUNNEL並沒有“允許您在打開SSH隧道時指定本地端口”。 不知道這是否是導致我的代碼出現問題的原因,我嘗試提出其他建議並找到了以下建議: http : //chxo.com/be2/20040511_5667.html

但是,這是我在努力的地方,而且似乎並沒有把我應該代替的占位符包裹住:

ssh -fNg -L 3307:127.0.0.1:3306 myuser@remotehost.com

我已經嘗試過了,但是沒有用:

ssh -fNg -L 3307:127.0.0.1:3306 ssh_user@ssh_host

我已經嘗試將localhost IP更改為ssh_host和mysql_host,以防萬一,並且它們也不起作用。

借助上面提供的所有數據,有人能完全按照我的需要使其變得如此明顯嗎? 我可以僅通過PHP函數執行此操作,還是需要運行命令?

編輯

根據@LSerni的評論,我剛剛嘗試運行此命令(將$ vars替換為上面的值):

exec("ssh -fNg -L 3306:$mysql_host:3306 $ssh_user@$ssh_host");
mysqli_connect("127.0.0.1", $mysql_user, $mysql_pass, $default);

但是,我現在得到的錯誤是(再次,將$ var替換為上面的值):

mysqli_connect(): (28000/1045): Access denied for user '$mysql_user'@'localhost'

取決於僅SSH約束的原因是什么,您的問題可能有多個答案。 我將繼續討論這一問題,因為這是我的確切用戶情況:MySQL服務必須僅接受來自其自己的服務器或通過私有IP的連接,並且使用它的應用服務器位於同一台機器上的不同機器上網絡。

在這種情況下,解決問題並使您免於打開服務器之間隧道的麻煩的最簡單方法是在連接字符串中使用MySQL服務器的專用IP,或在應用服務器上使用MySQL服務器專用IP的別名。

這樣,您可以像平常一樣只使用mysqli_connect字符串

在運行MySQL Workbench的計算機上,運行SSH會話以轉發MySQL端口:

ssh -fNg -L 3306:127.0.0.1:3306 myuser@remotehost.com

如果我誤解了,而您實際上有三台機器-SSH所用的計算機,SSH所用的計算機以及數據庫服務器; 或者,如果身份驗證使用外部接口(即,SSH所使用的IP與數據庫服務器相同),則需要

ssh -fNg -L 3306:123.45.67.8:3306 myuser@remotehost.com

其中123.45.67.8是您的數據庫服務器的地址。 如果123.45.67.8是同時使用SSH和MySQL服務器的計算機,則這也適用,因為否則可能會遇到身份驗證錯誤(user@123.45.67.8和user@127.0.0.1是兩個不同的身份驗證)。

現在,您可以使用已知在遠程計算機上工作的用戶名和密碼,從同一台計算機上連接到主機127.0.0.1( 不是 “ localhost”,因為它可能被解釋為Unix套接字)。

我剛剛在測試機上嘗試過此方法,並且可以正常工作。

請記住不要使用“ MySQL客戶端壓縮協議”,否則會嚴重延遲,因為SSH連接已經被壓縮。

(此外,某些SSH密碼將產生比其他密碼更好的性能)。

這是一種將python與mysql連接器連接的方法。首先打開python提示符,主要使用anaconda,因為它具有所有內置的包,首先關閉所有導入mysql.connector,然后連接到mysql,例如localhost用戶名密碼數據庫,然后輸入sql命令以插入刪除搜索命令

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM