Sử dụng chuyển tiếp cổng SSH.
Sửa đổi mã từ SSH lồng nhau bằng Python Paramiko đối với đường hầm cơ sở dữ liệu, bạn nhận được một đoạn mã như sau:
# establish SSH tunnel
self.ssh = paramiko.SSHClient()
# ...
self.ssh.connect(hostname=ssh_host, username=ssh_user, password=ssh_password)
transport = ssh_client.get_transport()
dest_addr = (db_host, db_port)
local_unique_port = 4000 # any unused local port
local_host = 'localhost'
local_addr = (local_host, local_unique_port)
vmchannel = vmtransport.open_channel("direct-tcpip", dest_addr, local_addr)
self.engine = create_engine(
'postgres+psycopg2://{}:{}@{}:{}/{}'.format(
db_user, db_password, local_host, local_unique_port, db))
Nếu cơ sở dữ liệu PostgreSQL chạy trên chính máy chủ SSH, thì nó thường chỉ lắng nghe trên giao diện loopback. Trong trường hợp đó db_host
nên được đặt thành localhost
.
Mặc dù lưu ý rằng sshtunnel
chỉ là một lớp bao bọc xung quanh Paramiko. Vì vậy, nói chung, bạn có thể sử dụng nó để đơn giản hóa mã, trừ khi bạn có một số hạn chế ngăn bạn cài đặt các gói bổ sung.
Ví dụ: Kết nối với cơ sở dữ liệu PostgreSQL thông qua SSH tunneling trong Python
Dựa trên câu hỏi tương tự về MongoDB:
Kết nối và truy vấn cơ sở dữ liệu Mongo qua SSH với khóa riêng bằng Python
.
Cảnh báo bắt buộc:Không sử dụng AutoAddPolicy
- Bạn đang mất khả năng bảo vệ khỏi các cuộc tấn công MITM
bằng cách làm như vậy. Để có giải pháp chính xác, hãy xem Paramiko "Máy chủ không xác định"
.