Za prvé, nebylo by lepší povolit tomuto uživateli vzdálený přístup k mysql? Neznám však vaše důvody.
Nejběžnějším transparentním způsobem by bylo vytvoření ssh tunelu. To lze provést dvěma různými způsoby. Pokud na počítači mysql není otevřený port mysql (3306), budete potřebovat tunel zpětného ssh, který musí otevřít vzdálený počítač. Přihlaste se k počítači mysql a zadejte následující příkaz:
ssh -R 12345:localhost:3306 [email protected]_machine -N
Pokud je na vzdáleném počítači otevřený port mysql, tunel může otevřít stroj php:
ssh -f [email protected]_machine -L 12345:mysql_machine:3306 -N
Bez ohledu na způsob, jakým byly tunely vytvořeny, může nyní aplikace PHP používat pouze PDO a připojit se k portu localhost 12345.
$pdo = new PDO('mysql:host=localhost;port=12345;dbname=test', $user, $password);
Veškerý provoz bude šifrován tunelem.
Pokud chcete pouze zadat několik jednoduchých příkazů, můžete použít následující alternativu.
Nejjednodušší, ale nezabezpečené způsob by bylo použít následující příkaz:
echo $ssh->exec('mysql -uUSER -pPASSWORD DATABASE -e "SQL COMMAND"');
Toto není bezpečné, protože ostatní uživatelé v systému mohou heslo vidět.
Problém se zabezpečením můžete obejít pomocí expect
. expect
je program, který dokáže předat heslo do mysql bezpečnějším způsobem. Ujistěte se, že expect
je nainstalován na vzdáleném systému. Zde je příklad pomocí SHOW TABLES
příkaz na databázi 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
');
Abych lépe porozuměl tomu, co se děje, nedávno jsem napsal svůj článek na blogu o tom.