Първо, не би ли било по-добре да разрешите отдалечен достъп на този потребител до 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
е инсталиран на отдалечената система. Ето един пример с помощта на 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
');
За да разбера допълнително какво става, наскоро написах моя статия в блога за това.