参考资料:
sshtunnel官方文档 https://pypi.org/project/sshtunnel/
pymysql 通过ssh连接 mysql服务器 https://hacpai.com/article/1573725286491
SSHTunnelForwarder隧道连接mysql https://blog.csdn.net/helloxiaozhe/article/details/77850367
通过账号密码直接连接:
# 打开数据库连接 主机地址 端口号3306 用户名 密码 数据库名 db = pymysql.connect(host="10.12.102.202", port=3309, user="qa_dev", passwd="xxx", db="wechat_test", charset="utf8") # 创建一个游标对象 cursor() cursor = db.cursor() # SQL查询语句 sql = "SELECT * FROM city WHERE city_id = '336'" try: cursor.execute(sql) results = cursor.fetchall() except: print("语句执行错误") # 关闭数据库 db.close()
通过ssh跳板机连接数据库:
1、出于安全考虑,数据库服务器只允许堡垒机通过ssh访问,MySQL数据库安装在A机器上,只允许服务器B访问,而我在C机器上可以通过SSH连接B服务器
如图所示:

2、代码示例 A:mysql 服务 B:跳板机 C:本地访问机器
1 import pymysql 2 from sshtunnel import SSHTunnelForwarder 3 4 with SSHTunnelForwarder( 5 ssh_address_or_host=('sa.xxxx.cn', 22), # ssh 目标服务器 ip 和 port 6 ssh_username="zhaoxxx", # ssh 目标服务器用户名 7 #ssh_password= "", # ssh 目标服务器用户密码 8 ssh_pkey="C:\Users\Administrator\.ssh\id_rsa", # ssh 目标服务器证书 9 #ssh_private_key_password="", # ssh 目标服务器证书密码 10 remote_bind_address=('10.10.xx.xxx', 3306), # mysql 服务ip 和 part 11 local_bind_address=('127.0.0.1', 5143) # ssh 目标服务器的用于连接 mysql 或 redis 的端口,该 ip 必须为 127.0.0.1 12 ) as server: 13 conn = pymysql.connect( 14 host=server.local_bind_host, # server.local_bind_host 是 参数 local_bind_address 的 ip 15 port=server.local_bind_port, # server.local_bind_host 是 参数 local_bind_address 的 port 16 user="name", 17 password="password", 18 db="test_data", 19 charset="utf8" 20 ) 21 cursor = conn.cursor() 22 sql = "SELECT * FROM satel_report WHERE id = 1" 23 try: 24 cursor.execute(sql) 25 data = cursor.fetchall() 26 print(data) 27 except: 28 print("SQL执行失败")
3、注意事项
(0) charset是要跟数据库的编码一样
(1) ssh_pkey="C:UsersXXXX.ssh证书"SSH 连接使用密钥证书登录,该参数必须该路径为目标服务器的公钥证书。window 秘钥ppk不能识别,需要id_rsa
(2) local_bind_address=('127.0.0.1', 5141)该参数必须SSH 目标服务器的用于连接 MySQL 或 Redis 的端口该 ip 必须为 127.0.0.1