Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

conecte-se ao banco de dados mysql usando a biblioteca phpseclib


Primeiro, não seria melhor permitir o acesso remoto desse usuário ao mysql? No entanto, não sei seus motivos.

A maneira transparente mais comum seria criar um túnel ssh. Isso pode ser feito de duas maneiras diferentes. Se a porta mysql (3306) não estiver aberta na máquina mysql, você precisará de um túnel ssh reverso que deve ser aberto pela máquina remota. Faça login na máquina mysql e emita o seguinte comando:
ssh -R 12345:localhost:3306 [email protected]_machine -N

Se a porta mysql estiver aberta na máquina remota, o túnel poderá ser aberto pela máquina php:
ssh -f [email protected]_machine -L 12345:mysql_machine:3306 -N

Independentemente da forma como os túneis foram criados, o aplicativo PHP agora pode apenas usar o PDO e se conectar à porta localhost 12345.
$pdo = new PDO('mysql:host=localhost;port=12345;dbname=test', $user, $password);

Todo o tráfego será criptografado através do túnel.

Se você quiser apenas emitir alguns comandos simples, poderá usar a seguinte alternativa.

O mais simples, mas inseguro maneira seria usar o seguinte comando:
echo $ssh->exec('mysql -uUSER -pPASSWORD DATABASE -e "SQL COMMAND"');

Isso é inseguro porque outros usuários do sistema podem ver a senha.

Você pode solucionar o problema de segurança usando expect . expect é um programa que pode passar a senha para o mysql de uma forma mais segura. Certifique-se de que expect está instalado no sistema remoto. Aqui vem um exemplo usando o SHOW TABLES comando no banco de dados 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 entender melhor o que está acontecendo, recentemente escrevi um artigo do blog sobre isso.