Erstens, wäre es nicht besser, diesem Benutzer den Fernzugriff auf mysql zu erlauben? Allerdings kenne ich deine Gründe nicht.
Der gebräuchlichste transparente Weg wäre das Erstellen eines SSH-Tunnels. Dies kann auf zwei verschiedene Arten erfolgen. Wenn der MySQL-Port (3306) auf dem MySQL-Rechner nicht geöffnet ist, benötigen Sie einen Reverse-SSH-Tunnel, der vom Remote-Rechner geöffnet werden muss. Melden Sie sich bei der MySQL-Maschine an und geben Sie den folgenden Befehl ein:
ssh -R 12345:localhost:3306 [email protected]_machine -N
Wenn der mysql-Port auf dem Remote-Rechner geöffnet ist, kann der Tunnel vom PHP-Rechner geöffnet werden:
ssh -f [email protected]_machine -L 12345:mysql_machine:3306 -N
Unabhängig davon, wie die Tunnel erstellt wurden, kann die PHP-Anwendung jetzt einfach PDO verwenden und eine Verbindung zum Localhost-Port 12345 herstellen.
$pdo = new PDO('mysql:host=localhost;port=12345;dbname=test', $user, $password);
Der gesamte Datenverkehr wird durch den Tunnel verschlüsselt.
Wenn Sie nur ein paar einfache Befehle ausführen möchten, können Sie die folgende Alternative verwenden.
Die einfachste, aber unsichere Der Weg wäre, den folgenden Befehl zu verwenden:
echo $ssh->exec('mysql -uUSER -pPASSWORD DATABASE -e "SQL COMMAND"');
Dies ist unsicher, da andere Benutzer des Systems das Passwort sehen könnten.
Sie können das Sicherheitsproblem mit expect
umgehen . expect
ist ein Programm, das das Passwort sicherer an mysql weitergeben kann. Stellen Sie sicher, dass expect
auf dem Remote-System installiert ist. Hier kommt ein Beispiel mit SHOW TABLES
Befehl auf Datenbank 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
');
Um besser zu verstehen, was vor sich geht, habe ich kürzlich einen my Blogartikel darüber.