För det första, vore det inte bättre att tillåta fjärråtkomst för den användaren till mysql? Men jag vet inte dina skäl.
Det vanligaste och transparenta sättet skulle vara att skapa en ssh-tunnel. Detta kan göras på två olika sätt. Om mysql-porten (3306) inte är öppen på mysql-maskinen, behöver du en omvänd ssh-tunnel som måste öppnas av fjärrmaskinen. Logga in på mysql-maskinen och utfärda följande kommando:
ssh -R 12345:localhost:3306 [email protected]_machine -N
Om mysql-porten är öppen på fjärrmaskinen kan tunneln öppnas av php-maskinen:
ssh -f [email protected]_machine -L 12345:mysql_machine:3306 -N
Oavsett hur tunnlarna har skapats kan PHP-applikationen nu bara använda PDO och ansluta till localhost port 12345.
$pdo = new PDO('mysql:host=localhost;port=12345;dbname=test', $user, $password);
All trafik kommer att krypteras genom tunneln.
Om du bara vill utfärda ett par enkla kommandon kan du använda följande alternativ.
Det enklaste men osäkra sätt skulle vara att använda följande kommando:
echo $ssh->exec('mysql -uUSER -pPASSWORD DATABASE -e "SQL COMMAND"');
Detta är osäkert eftersom andra användare på systemet kan se lösenordet.
Du kan lösa säkerhetsproblemet med expect
. expect
är ett program som kan skicka lösenordet till mysql på ett säkrare sätt. Se till att expect
är installerat på fjärrsystemet. Här kommer ett exempel som använder SHOW TABLES
kommando i databasen 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
');
För att ytterligare förstå vad som händer har jag nyligen skrivit en min bloggartikel om det.