python开启ssh端口转发
需求
db_server机器上运行了一个mysql数据库,仅允许ops机器连接,ecs机器可以连接ops机器,但是连不到db_server。
问:ecs如何能连接到db_server机器上的mysql数据库
代码示例
python
# 导入必要的库
from sshtunnel import SSHTunnelForwarder # 用于建立 SSH 隧道
import pymysql # 用于连接和操作 MySQL 数据库
# 使用 SSH 隧道转发器(SSHTunnelForwarder)建立安全隧道
# 该隧道将本地端口(127.0.0.1:3308)转发到远程 MySQL 服务器(通过跳板机)
with SSHTunnelForwarder(
ssh_address_or_host=('ops机器IP', ops机器SSH端口), # 跳板机(堡垒机)的 IP 和 SSH 端口
ssh_username='ops_username', # 登录跳板机的用户名
ssh_password='ops_password', # 登录跳板机的密码(建议改用私钥认证更安全)
remote_bind_address=('MinIRDs内网地址', 3306), # 目标 MySQL 服务器的内网地址和端口(通常为 3306)
local_bind_address=('127.0.0.1', 3308) # 本地绑定的地址和端口,用于后续连接
) as tunnel:
# 隧道建立成功后,通过本地 127.0.0.1:3308 连接到远程 MySQL(实际流量经 SSH 隧道加密转发)
connection = pymysql.connect(
host='127.0.0.1', # 连接本地回环地址(因为隧道已将远程数据库映射到本地)
port=3308, # 使用隧道绑定的本地端口
user='mysql_username', # MySQL 数据库用户名
password='mysql_password', # MySQL 数据库密码
database='your_database' # 要连接的具体数据库名
)
# 在此处执行你的数据库操作,例如查询、插入、更新等
# 示例:
# cursor = connection.cursor()
# cursor.execute("SELECT * FROM your_table")
# results = cursor.fetchall()
# ...
# 操作完成后,关闭数据库连接
connection.close()
# with 语句结束时,SSHTunnelForwarder 会自动关闭 SSH 隧道