sql >> Base de Datos >  >> RDS >> Mysql

conectarse a la base de datos mysql usando la biblioteca phpseclib

Primero, ¿no sería mejor permitir el acceso remoto de ese usuario a mysql? Sin embargo, no sé tus razones.

La forma más común y transparente sería crear un túnel ssh. Esto se puede hacer de dos maneras diferentes. Si el puerto mysql (3306) no está abierto en la máquina mysql, necesitará un túnel ssh inverso que debe abrir la máquina remota. Inicie sesión en la máquina mysql y emita el siguiente comando:

ssh -R 12345:localhost:3306 [email protected]_machine -N

Si el puerto mysql está abierto en la máquina remota, la máquina php puede abrir el túnel:

ssh -f [email protected]_machine -L 12345:mysql_machine:3306 -N

Independientemente de la forma en que se hayan creado los túneles, la aplicación PHP ahora solo puede usar PDO y conectarse al puerto localhost 12345.

$pdo = new PDO('mysql:host=localhost;port=12345;dbname=test', $user, $password);

Todo el tráfico se cifrará a través del túnel.

Si solo desea emitir un par de comandos simples, puede usar la siguiente alternativa.

El más simple pero inseguro sería usar el siguiente comando:

echo $ssh->exec('mysql -uUSER -pPASSWORD DATABASE -e "SQL COMMAND"');

Esto no es seguro porque otros usuarios del sistema podrían ver la contraseña.

Puede solucionar el problema de seguridad usando expect . expect es un programa que puede pasar la contraseña a mysql de una manera más segura. Asegúrese de que expect está instalado en el sistema remoto. Aquí viene un ejemplo usando SHOW TABLES comando en la base de datos 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
');

Para comprender mejor lo que sucede, recientemente escribí mi artículo de blog sobre eso.