首先,允许该用户远程访问mysql不是更好吗?不过,我不知道你的理由。
最常见的透明方式是创建 ssh 隧道。这可以通过两种不同的方式来完成。如果 mysql 计算机上未打开 mysql 端口 (3306),则您将需要一个必须由远程计算机打开的反向 ssh 隧道。登录 mysql 机器并发出以下命令:
ssh -R 12345:localhost:3306 user@php_machine -N
如果远程计算机上的 mysql 端口打开,则 php 计算机可以打开隧道:
ssh -f user@mysql_machine -L 12345:mysql_machine:3306 -N
无论隧道的创建方式如何,PHP 应用程序现在都可以仅使用 PDO 并连接到本地主机端口 12345。
$pdo = new PDO('mysql:host=localhost;port=12345;dbname=test', $user, $password);
所有流量都将通过隧道进行加密。
如果您只想发出几个简单的命令,您可以使用以下替代方案。
最简单但是unsecure方法是使用以下命令:
echo $ssh->exec('mysql -uUSER -pPASSWORD DATABASE -e "SQL COMMAND"');
这是不安全的,因为系统上的其他用户可以看到该密码。
您可以使用以下方法解决安全问题expect
. expect
是一个可以以更安全的方式将密码传递给mysql的程序。确保expect
安装在远程系统上。这是一个使用的示例SHOW TABLES
数据库命令test
:
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
');
为了进一步了解发生了什么,我最近写了一篇博客文章 http://www.metashock.de/2013/07/safely-pass-mysql-credentials-to-mysqldump-in-a-script/关于那个。