Đầu tiên, sẽ tốt hơn nếu cho phép người dùng đó truy cập từ xa vào mysql? Tuy nhiên, tôi không biết lý do của bạn.
Cách phổ biến nhất, một cách minh bạch sẽ là tạo một đường hầm ssh. Điều này có thể được thực hiện theo hai cách khác nhau. Nếu cổng mysql (3306) không mở trên máy mysql, bạn sẽ cần một đường hầm ssh ngược mà máy từ xa phải mở. Đăng nhập vào máy mysql và ra lệnh sau:
ssh -R 12345:localhost:3306 [email protected]_machine -N
Nếu cổng mysql đang mở trên máy từ xa thì máy php có thể mở đường hầm:
ssh -f [email protected]_machine -L 12345:mysql_machine:3306 -N
Bất kể đường hầm đã được tạo theo cách nào, ứng dụng PHP giờ đây chỉ có thể sử dụng PDO và kết nối với cổng localhost 12345.
$pdo = new PDO('mysql:host=localhost;port=12345;dbname=test', $user, $password);
Tất cả giao thông sẽ được thông qua đường hầm.
Nếu bạn chỉ muốn đưa ra một vài lệnh đơn giản, bạn có thể sử dụng cách thay thế sau.
Đơn giản nhất nhưng không an toàn cách sẽ là sử dụng lệnh sau:
echo $ssh->exec('mysql -uUSER -pPASSWORD DATABASE -e "SQL COMMAND"');
Điều này không an toàn vì những người dùng khác trên hệ thống có thể thấy mật khẩu.
Bạn có thể giải quyết vấn đề bảo mật bằng cách sử dụng expect
. expect
là một chương trình có thể chuyển mật khẩu tới mysql theo cách an toàn hơn. Đảm bảo rằng expect
được cài đặt trên hệ thống từ xa. Đây là một ví dụ sử dụng SHOW TABLES
lệnh trên cơ sở dữ liệu 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
');
Để hiểu thêm điều gì đang xảy ra, gần đây tôi đã viết bài viết trên blog về điều đó.