Po pierwsze, czy nie byłoby lepiej zezwolić temu użytkownikowi na zdalny dostęp do mysql? Jednak nie znam twoich powodów.
Najpopularniejszym przejrzystym sposobem byłoby utworzenie tunelu ssh. Można to zrobić na dwa różne sposoby. Jeśli port mysql (3306) nie jest otwarty na maszynie mysql, będziesz potrzebować odwróconego tunelu ssh, który musi zostać otwarty przez zdalną maszynę. Zaloguj się do maszyny mysql i wydaj następujące polecenie:
ssh -R 12345:localhost:3306 [email protected]_machine -N
Jeśli port mysql jest otwarty na zdalnej maszynie, tunel może zostać otwarty przez maszynę php:
ssh -f [email protected]_machine -L 12345:mysql_machine:3306 -N
Niezależnie od sposobu, w jaki tunele zostały utworzone, aplikacja PHP może teraz po prostu użyć PDO i połączyć się z portem localhost 12345.
$pdo = new PDO('mysql:host=localhost;port=12345;dbname=test', $user, $password);
Cały ruch zostanie zaszyfrowany przez tunel.
Jeśli chcesz tylko wydać kilka prostych poleceń, możesz użyć następującej alternatywy.
Najprostszy, ale niebezpieczny sposobem byłoby użycie następującego polecenia:
echo $ssh->exec('mysql -uUSER -pPASSWORD DATABASE -e "SQL COMMAND"');
Jest to niebezpieczne, ponieważ inni użytkownicy w systemie mogli zobaczyć hasło.
Możesz obejść problem bezpieczeństwa za pomocą expect
. expect
to program, który może w bezpieczniejszy sposób przekazywać hasło do mysql. Upewnij się, że expect
jest zainstalowany w systemie zdalnym. Oto przykład przy użyciu SHOW TABLES
polecenie w bazie danych 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
');
Aby lepiej zrozumieć, co się dzieje, niedawno napisałem mój artykuł na blogu o tym.