1. 程式人生 > 實用技巧 >pymysql連線資料庫及通過SSH跳板機連線資料庫

pymysql連線資料庫及通過SSH跳板機連線資料庫

參考資料: 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.112.102", 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:\Users\XXXX\.ssh\證書"SSH 連線使用金鑰證書登入,該引數必須該路徑為目標伺服器的公鑰證書。window 祕鑰ppk不能識別,需要id_rsa (2)local_bind_address=('127.0.0.1', 5141)該引數必須SSH 目標伺服器的用於連線 MySQL 或 Redis 的埠該 ip 必須為 127.0.0.1