首先,允許遠程訪問該用戶到mysql是不是更好?但是,我不知道你的理由。
最常見的透明方式是創建一個ssh隧道。這可以通過兩種不同的方式完成。如果mysql端口(3306)未在mysql機器上打開,則需要反向ssh隧道,該隧道必須由遠程機器打開。登錄到MySQL的機器,併發出以下命令:
ssh -R 12345:localhost:3306 [email protected]_machine -N
如果MySQL端口是遠程機器,那麼隧道可以通過PHP服務器開啓開放:
ssh -f [email protected]_machine -L 12345:mysql_machine:3306 -N
不管方式隧道已經創建,PHP應用程序現在可以只使用PDO並連接到本地主機端口12345
$pdo = new PDO('mysql:host=localhost;port=12345;dbname=test', $user, $password);
所有的流量將通過隧道加密後得到。
如果你只是想發出幾個簡單的命令,你可以使用下面的替代方法。
最簡單的,但不安全方法是使用下面的命令:
echo $ssh->exec('mysql -uUSER -pPASSWORD DATABASE -e "SQL COMMAND"');
這是不安全的,因爲系統上的其他用戶可以看到密碼。
您可以使用expect
解決安全問題。 expect
是一個可以以更安全的方式將密碼傳遞給mysql的程序。確保在遠程系統上安裝了expect
。這裏使用的數據庫test
的SHOW TABLES
命令來一個例子:
include('Net/SSH2.php');
$ssh = new Net_SSH2('192.xxx.xxx.xxx');
if (!$ssh->login('ssh_user', 'ssh_password')) {
exit('Login Failed');
}
echo $ssh->exec('expect <<EOF
# disable command output
log_user 0
# start the mysqldump process
spawn mysql -uTHE_USER -p test -e "SHOW TABLES"
# wait for the password prompt
expect "password:"
# send the password (mind the \r)
send "THE_PASSWORD\r"
# enable output again
log_user 1
# echo all outout until the end
expect eof
EOF
');
爲了進一步瞭解這是怎麼回事,我最近寫了我的blog article有關。
的[經由SSH通過PHP連接到一個MySQL數據庫]可能重複(http://stackoverflow.com/questions/18069658/connect-to-a-mysql-database-通過ssh通過PHP) – neubert
那些不重複 – underscore
也有http://stackoverflow.com/q/5980409/569976我猜,但hek2mgl的答案是更好,我認爲。 – neubert