sql >> Database >  >> RDS >> Mysql

maak verbinding met de mysql-database met behulp van de phpseclib-bibliotheek

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.



  1. Hoe bepaalt SQL Server het formaat voor impliciete datetime-conversie?

  2. Entity Framework + MySQL - Waarom zijn de prestaties zo slecht?

  3. MySQL Tree gerangschikt op ouder en kind

  4. Oracle - Gematerialiseerde weergave nog steeds toegankelijk tijdens volledige vernieuwing. Hoe werkt dit?