『Python』Python通過SSH連接遠程數據庫

在這裏插入圖片描述

前言

永遠相信美好的事情即將發生


背景

前段時間一直在做Python爬蟲的開發(別問我爲什麼一個Java要去搞Python爬蟲,我就是塊磚),因學藝不精,未能21天從入門到精通,導致出現過形形色色的問題,其中一個就是通過SSH連接線上服務器數據庫一直無法連接成功,後來也是一直用PuTTY內網穿透勉強度日,今日終於痛下決心,鑽研半日,方得原因,頓時捶胸頓足,噫籲嚱,菜哉

在這裏插入圖片描述

踩坑

其實剛開始寫的時候我是拒絕的,連接數據庫?連接數據庫有啥好寫的

在這裏插入圖片描述
你先這樣

在這裏插入圖片描述

在這樣

在這裏插入圖片描述

不就好了
在這裏插入圖片描述
然後我就發現我看不懂了,可能 八成 一定是因爲我太菜了

爬坑

在網上看了一下大佬們的博客,什麼堡壘機,什麼跳板機之類的,看得我一度對自己的語文水平產生懷疑,一臉懵圈的來,一臉懵圈的走

在這裏插入圖片描述
菜定思菜,後來通過我不懈的學(bai)習(du)和請(sao)教(rao),也終於有了些心得,下面我會用自己的理解來向大家展示,如果有什麼不對的地方歡迎各位留言

在這裏插入圖片描述
連接之前首先要了解這麼幾個知識點

  • 什麼是SSH

SSH 爲 Secure Shell 的縮寫,由 IETF 的網絡小組(Network Working Group)所制定;SSH 爲建立在應用層基礎上的安全協議。SSH 是較可靠,專爲遠程登錄會話和其他網絡服務提供安全性的協議。利用 SSH 協議可以有效防止遠程管理過程中的信息泄露問題。

通俗點講,以前的網絡通信都是明文數據傳輸,一旦被截獲,那麼我們的信息都將被對方輕易獲取。後來SSH協議橫空出世,用戶登錄時向服務器發送請求,服務器將公鑰發送給客戶端,客戶端通過公鑰加密後再將加密的的數據發送給服務器,服務器在通過一個只有自己知道的私鑰去解密,雖然這中間也無法避免所有的攻擊,但相對於近乎“裸奔”的數據通信來說已經是很大的進步

在這裏插入圖片描述

首先,我們需要導入mysql和sshtunnel這兩個必要的包,前者是什麼就不用介紹了,sshtunnel則是用戶能通過SSH安全隧道訪問遠程服務器的關鍵

import mysql.connector
import sshtunnel

with sshtunnel.SSHTunnelForwarder(
        ('這裏填遠程服務器的地址', 這裏填端口號),
        ssh_username='服務器的用戶名,不是數據庫的!!!',
        ssh_password='服務器的密碼',
        remote_bind_address=('數據庫的地址', 數據庫端口號,一般都是3306),
        local_bind_address=('127.0.0.1', 13306)
) as tunnel:
    conn = mysql.connector.connect(
        user='數據庫的用戶名',
        password='數據庫的密碼',
        host='127.0.0.1',
        port=13306,
        database='需要連接的庫名',
    )
    cursor = conn.cursor()
    query = "select version();"
    cursor.execute(query)
    data = cursor.fetchall()
    print(data)

有幾點需要特別注意:

1.寫端口號的時候切記不要加引號!!!
2.最上面的那個連接信息一定是服務器的,不是數據庫的!!!
3.綁定的本地端口號不一定非要是13306,只要沒有端口衝突都行!!!
4.如果密碼中有‘\’,切記一定要用‘\\’進行轉義!!!

個人理解

其實以我淺顯的知識儲備來解釋,還是很好理解的。首先通過 sshtunnel.SSHTunnelForwarder 進行端口映射,將遠程服務器的3306端口映射到本地的13306端口,再連接本地的端口,那麼後續對本地13306端口的操作其實都可以視爲對線上服務器3306端口的操作,理論上來說,PuTTY也是進行了相同的操作,以此達到內網穿透的目的。

在這裏插入圖片描述

總結

連接數據庫的方法其實還是挺簡單的,最主要還是細心,以前有一個憨憨,他們的密碼中有一個反斜槓,而他沒有轉義就直接傳了進去,導致死活連接不上,找了好久的原因也沒找着,最後就不了了之,別問我爲什麼知道的那麼多

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章