Python實(shí)現(xiàn)SSH隧道功能的示例代碼
在現(xiàn)代的網(wǎng)絡(luò)環(huán)境中,安全地傳輸數(shù)據(jù)變得越來越重要。SSH(Secure Shell)是一種網(wǎng)絡(luò)協(xié)議,用于安全地遠(yuǎn)程登錄到其他計(jì)算機(jī)上。SSH隧道是利用SSH協(xié)議建立一個(gè)加密通道,以保護(hù)通過不安全網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)。本文將介紹如何使用Python來實(shí)現(xiàn)SSH隧道功能。
1. 環(huán)境準(zhǔn)備
1.1 安裝必要的庫
要使用Python創(chuàng)建SSH隧道,首先需要安裝??paramiko??庫,這是一個(gè)用于處理SSH2協(xié)議的Python實(shí)現(xiàn)??梢酝ㄟ^pip安裝:
pip install paramiko
1.2 準(zhǔn)備SSH服務(wù)器
確保你有一個(gè)可以訪問的SSH服務(wù)器,并且有權(quán)限通過SSH連接到該服務(wù)器。你需要知道服務(wù)器的IP地址、端口號(hào)、用戶名和密碼或私鑰文件。
2. 創(chuàng)建SSH隧道
2.1 基本概念
SSH隧道分為兩種類型:
- 本地隧道:將本地端口轉(zhuǎn)發(fā)到遠(yuǎn)程主機(jī)。
- 遠(yuǎn)程隧道:將遠(yuǎn)程端口轉(zhuǎn)發(fā)到本地主機(jī)。
2.2 使用Paramiko創(chuàng)建本地隧道
下面是一個(gè)使用??paramiko??創(chuàng)建本地SSH隧道的例子,該隧道將本地的8080端口轉(zhuǎn)發(fā)到遠(yuǎn)程服務(wù)器上的80端口。
import paramiko
from sshtunnel import SSHTunnelForwarder
def create_ssh_tunnel(ssh_host, ssh_port, ssh_user, ssh_password, remote_bind_address, local_bind_address):
# 創(chuàng)建SSH隧道
server = SSHTunnelForwarder(
(ssh_host, ssh_port),
ssh_username=ssh_user,
ssh_password=ssh_password,
remote_bind_address=remote_bind_address,
local_bind_address=local_bind_address
)
# 啟動(dòng)SSH隧道
server.start()
print(f"SSH tunnel established: {local_bind_address[1]} -> {remote_bind_address}")
return server
if __name__ == "__main__":
# SSH服務(wù)器信息
ssh_host = 'your.ssh.server.com'
ssh_port = 22
ssh_user = 'your_username'
ssh_password = 'your_password'
# 遠(yuǎn)程服務(wù)信息
remote_bind_address = ('localhost', 80)
# 本地監(jiān)聽地址
local_bind_address = ('0.0.0.0', 8080)
# 創(chuàng)建SSH隧道
tunnel = create_ssh_tunnel(ssh_host, ssh_port, ssh_user, ssh_password, remote_bind_address, local_bind_address)
try:
# 保持程序運(yùn)行
while True:
pass
except KeyboardInterrupt:
# 關(guān)閉SSH隧道
tunnel.stop()
print("SSH tunnel closed.")2.3 使用Paramiko創(chuàng)建遠(yuǎn)程隧道
創(chuàng)建遠(yuǎn)程隧道的過程與本地隧道類似,但方向相反。下面是一個(gè)示例,將遠(yuǎn)程服務(wù)器的9000端口轉(zhuǎn)發(fā)到本地的8080端口。
import paramiko
def create_remote_tunnel(ssh_host, ssh_port, ssh_user, ssh_password, remote_bind_address, local_bind_address):
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(ssh_host, ssh_port, ssh_user, ssh_password)
transport = client.get_transport()
transport.request_port_forward('', remote_bind_address[1])
def handler(chan, host, port):
sock = socket.socket()
try:
sock.connect((host, port))
except Exception as e:
print('Forwarding request to %s:%d failed: %r' % (host, port, e))
return
print('Connected! Tunnel open %r -> %r -> %r' % (chan.origin_addr, chan.getpeername(), (host, port)))
while True:
r, w, x = select.select([sock, chan], [], [])
if sock in r:
data = sock.recv(1024)
if len(data) == 0:
break
chan.send(data)
if chan in r:
data = chan.recv(1024)
if len(data) == 0:
break
sock.send(data)
chan.close()
sock.close()
print('Tunnel closed from %r' % (chan.origin_addr,))
for i in range(transport.server_mode.port):
transport.open_channel('direct-tcpip', local_bind_address, remote_bind_address, handler)
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
print("Closing connections...")
transport.close()
client.close()
if __name__ == "__main__":
# SSH服務(wù)器信息
ssh_host = 'your.ssh.server.com'
ssh_port = 22
ssh_user = 'your_username'
ssh_password = 'your_password'
# 遠(yuǎn)程服務(wù)信息
remote_bind_address = ('0.0.0.0', 9000)
# 本地監(jiān)聽地址
local_bind_address = ('localhost', 8080)
# 創(chuàng)建遠(yuǎn)程SSH隧道
create_remote_tunnel(ssh_host, ssh_port, ssh_user, ssh_password, remote_bind_address, local_bind_address)通過上述示例,我們可以看到使用Python和??paramiko??庫創(chuàng)建SSH隧道非常方便。無論是本地隧道還是遠(yuǎn)程隧道,都能有效地幫助我們?cè)诓话踩木W(wǎng)絡(luò)中安全地傳輸數(shù)據(jù)。希望這篇文章能對(duì)你有所幫助!
3.方法補(bǔ)充
SSH隧道是一種安全的方式,通過它可以在兩個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)之間建立加密的通信通道。這在需要遠(yuǎn)程訪問數(shù)據(jù)庫、內(nèi)部服務(wù)或需要繞過防火墻限制時(shí)非常有用。
以下是一個(gè)使用Python實(shí)現(xiàn)SSH隧道的示例代碼。我們將使用 ??paramiko?? 庫來創(chuàng)建SSH連接,并使用 ??sshtunnel?? 庫來建立隧道。首先,你需要安裝這兩個(gè)庫:
pip install paramiko sshtunnel
假設(shè)我們有一個(gè)遠(yuǎn)程服務(wù)器 ??remote_server??,其IP地址為 ??192.168.1.100??,SSH端口為 ??22??,用戶名為 ??user??,密碼為 ??password??。我們希望通過這個(gè)服務(wù)器訪問一個(gè)內(nèi)部數(shù)據(jù)庫,數(shù)據(jù)庫的IP地址為 ??192.168.1.200??,端口為 ??3306??。
示例代碼
import pymysql
from sshtunnel import SSHTunnelForwarder
# SSH服務(wù)器信息
ssh_host = '192.168.1.100'
ssh_port = 22
ssh_username = 'user'
ssh_password = 'password'
# 目標(biāo)數(shù)據(jù)庫信息
db_host = '192.168.1.200'
db_port = 3306
db_user = 'db_user'
db_password = 'db_password'
db_name = 'database_name'
# 創(chuàng)建SSH隧道
with SSHTunnelForwarder(
(ssh_host, ssh_port),
ssh_username=ssh_username,
ssh_password=ssh_password,
remote_bind_address=(db_host, db_port)
) as tunnel:
# 隧道建立成功后,本地端口被轉(zhuǎn)發(fā)到目標(biāo)數(shù)據(jù)庫
local_port = tunnel.local_bind_port
# 連接數(shù)據(jù)庫
conn = pymysql.connect(
host='127.0.0.1',
port=local_port,
user=db_user,
password=db_password,
database=db_name
)
try:
with conn.cursor() as cursor:
# 執(zhí)行SQL查詢
sql = "SELECT * FROM your_table"
cursor.execute(sql)
results = cursor.fetchall()
for row in results:
print(row)
finally:
# 關(guān)閉數(shù)據(jù)庫連接
conn.close()代碼解釋
- 導(dǎo)入庫:導(dǎo)入 ??pymysql?? 和 ??SSHTunnelForwarder??。
- 定義SSH和數(shù)據(jù)庫信息:設(shè)置SSH服務(wù)器和目標(biāo)數(shù)據(jù)庫的相關(guān)信息。
- 創(chuàng)建SSH隧道:使用 ??SSHTunnelForwarder?? 創(chuàng)建SSH隧道。??remote_bind_address?? 指定了目標(biāo)數(shù)據(jù)庫的IP和端口。
- 連接數(shù)據(jù)庫:通過隧道連接到目標(biāo)數(shù)據(jù)庫。注意,這里使用的是 ??127.0.0.1?? 和 ??local_port??,因?yàn)樗淼缹⑦h(yuǎn)程端口映射到了本地端口。
- 執(zhí)行SQL查詢:執(zhí)行一個(gè)簡單的SQL查詢并打印結(jié)果。
- 關(guān)閉連接:確保在完成操作后關(guān)閉數(shù)據(jù)庫連接。
注意事項(xiàng)
- 確保SSH服務(wù)器允許你進(jìn)行端口轉(zhuǎn)發(fā)。
- 如果使用密鑰文件而不是密碼,可以將 ??ssh_password?? 替換為 ??ssh_pkey??,并指定密鑰文件路徑。
- 處理異常情況,確保在發(fā)生錯(cuò)誤時(shí)能夠正確關(guān)閉連接。
在Python中實(shí)現(xiàn)SSH隧道功能通常用于安全地連接到遠(yuǎn)程服務(wù)器,以便進(jìn)行數(shù)據(jù)庫訪問、文件傳輸?shù)炔僮?。SSH隧道可以提供一個(gè)加密的通道,確保數(shù)據(jù)傳輸?shù)陌踩?。下面詳?xì)介紹如何使用Python實(shí)現(xiàn)SSH隧道。
使用 ??paramiko?? 庫
??paramiko?? 是一個(gè)非常流行的 Python 庫,用于實(shí)現(xiàn) SSH2 協(xié)議。它允許你創(chuàng)建 SSH 客戶端和服務(wù)器,并且支持 SSH 隧道。
安裝 ??paramiko??
首先,你需要安裝 ??paramiko?? 庫。你可以使用 ??pip?? 來安裝:
pip install paramiko
創(chuàng)建 SSH 隧道
以下是一個(gè)示例代碼,展示如何使用 ??paramiko?? 創(chuàng)建一個(gè) SSH 隧道:
import paramiko
from sshtunnel import SSHTunnelForwarder
# SSH 服務(wù)器信息
ssh_host = 'your_ssh_server_ip'
ssh_port = 22
ssh_user = 'your_username'
ssh_password = 'your_password'
# 遠(yuǎn)程服務(wù)信息
remote_bind_address = ('127.0.0.1', 3306) # 假設(shè)遠(yuǎn)程服務(wù)是 MySQL 數(shù)據(jù)庫
# 本地綁定地址
local_bind_address = ('127.0.0.1', 10022)
# 創(chuàng)建 SSH 隧道
with SSHTunnelForwarder(
(ssh_host, ssh_port),
ssh_username=ssh_user,
ssh_password=ssh_password,
remote_bind_address=remote_bind_address,
local_bind_address=local_bind_address
) as tunnel:
print(f"SSH tunnel established: {local_bind_address} -> {remote_bind_address}")
# 在這里執(zhí)行需要通過隧道的操作,例如連接到數(shù)據(jù)庫
import pymysql
db = pymysql.connect(
host='127.0.0.1',
port=tunnel.local_bind_port,
user='db_user',
password='db_password',
database='db_name'
)
cursor = db.cursor()
cursor.execute("SELECT * FROM your_table")
results = cursor.fetchall()
for row in results:
print(row)
db.close()
print("SSH tunnel closed")代碼解釋
導(dǎo)入庫:
- ??paramiko??:用于 SSH 連接。
- ??SSHTunnelForwarder??:用于創(chuàng)建 SSH 隧道。
配置 SSH 服務(wù)器信息:
- ssh_host??:SSH 服務(wù)器的 IP 地址。
- ??ssh_port??:SSH 服務(wù)器的端口(默認(rèn)為 22)。
- ??ssh_user??:SSH 服務(wù)器的用戶名。
- ??ssh_password??:SSH 服務(wù)器的密碼。
配置遠(yuǎn)程服務(wù)信息:
??remote_bind_address??:遠(yuǎn)程服務(wù)的地址和端口,例如 MySQL 數(shù)據(jù)庫的地址和端口。
配置本地綁定地址:
??local_bind_address??:本地綁定的地址和端口,用于監(jiān)聽本地連接。
創(chuàng)建 SSH 隧道:
- 使用 ??SSHTunnelForwarder?? 創(chuàng)建 SSH 隧道。
- ??with?? 語句確保隧道在使用完畢后自動(dòng)關(guān)閉。
執(zhí)行操作:
- 在隧道建立后,可以通過 ??tunnel.local_bind_port?? 訪問遠(yuǎn)程服務(wù)。
- 示例中使用 ??pymysql?? 連接到 MySQL 數(shù)據(jù)庫并執(zhí)行查詢。
關(guān)閉隧道:
??with?? 語句塊結(jié)束后,隧道會(huì)自動(dòng)關(guān)閉。
注意事項(xiàng)
確保 SSH 服務(wù)器上的防火墻允許從本地機(jī)器的連接。
如果使用密鑰文件而不是密碼進(jìn)行身份驗(yàn)證,可以在 ??SSHTunnelForwarder?? 中指定 ??ssh_pkey?? 參數(shù)。
處理異常情況,例如網(wǎng)絡(luò)中斷或認(rèn)證失敗。
通過以上步驟,你可以在 Python 中輕松地創(chuàng)建和管理 SSH 隧道,確保數(shù)據(jù)傳輸?shù)陌踩院涂煽啃浴?/p>
以上就是Python實(shí)現(xiàn)SSH隧道功能的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Python SSH隧道功能的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
pandas 如何保存數(shù)據(jù)到excel,csv
這篇文章主要介紹了pandas 如何保存數(shù)據(jù)到excel,csv的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
Python光學(xué)仿真wxpython透鏡演示系統(tǒng)初始化與參數(shù)調(diào)節(jié)
這篇文章主要為大家介紹了Python光學(xué)仿真wxpython透鏡演示系統(tǒng)的初始化與參數(shù)調(diào)節(jié),同樣在學(xué)習(xí)wxpython透鏡演示系統(tǒng)的入門同學(xué)可以借鑒參考下,希望能夠有所幫助2021-10-10
python實(shí)現(xiàn)Excel文件轉(zhuǎn)換為TXT文件
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)Excel文件轉(zhuǎn)換為TXT文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04
Django csrf 驗(yàn)證問題的實(shí)現(xiàn)
csrf是通過偽裝來自受信任用戶的請(qǐng)求來利用受信任的網(wǎng)站。這篇文章主要介紹了Django csrf 驗(yàn)證問題的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-10-10
Python中循環(huán)后使用list.append()數(shù)據(jù)被覆蓋問題的解決
這篇文章主要給大家介紹了關(guān)于Python中循環(huán)后使用list.append()數(shù)據(jù)被覆蓋問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07
python 找出list中最大或者最小幾個(gè)數(shù)的索引方法
今天小編就為大家分享一篇python 找出list中最大或者最小幾個(gè)數(shù)的索引方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-10-10

