Ten eerste, zou het niet beter zijn om die gebruiker op afstand toegang te verlenen tot mysql? Ik ken uw redenen echter niet.
De meest gebruikelijke en transparante manier is om een ssh-tunnel te maken. Dit kan op twee verschillende manieren. Als de mysql-poort (3306) niet open is op de mysql-machine, hebt u een reverse ssh-tunnel nodig die door de externe machine moet worden geopend. Log in op de mysql-machine en geef het volgende commando:
ssh -R 12345:localhost:3306 [email protected]_machine -N
Als de mysql-poort open is op de externe machine, kan de tunnel worden geopend door de php-machine:
ssh -f [email protected]_machine -L 12345:mysql_machine:3306 -N
Ongeacht de manier waarop de tunnels zijn gemaakt, kan de PHP-toepassing nu gewoon PDO gebruiken en verbinding maken met localhost-poort 12345.
$pdo = new PDO('mysql:host=localhost;port=12345;dbname=test', $user, $password);
Al het verkeer wordt versleuteld door de tunnel.
Als u slechts een paar eenvoudige commando's wilt geven, kunt u het volgende alternatief gebruiken.
De eenvoudigste maar onveilige manier zou zijn om het volgende commando te gebruiken:
echo $ssh->exec('mysql -uUSER -pPASSWORD DATABASE -e "SQL COMMAND"');
Dit is onveilig omdat andere gebruikers op het systeem het wachtwoord kunnen zien.
U kunt het beveiligingsprobleem omzeilen met expect
. expect
is een programma dat het wachtwoord op een veiligere manier aan mysql kan doorgeven. Zorg ervoor dat expect
is geïnstalleerd op het externe systeem. Hier komt een voorbeeld met behulp van de SHOW TABLES
commando op database 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
');
Om beter te begrijpen wat er aan de hand is, heb ik onlangs een my blogartikel daarover.