一、什么是SSHTunnel
在访问某些外部网络资源时,我们常常需要通过VPN或跳板机等方式进行访问。SSHTunnel正是一种通过SSH隧道,将本地端口映射到远程服务器上的工具。通过SSHTunnel,我们可以在本地直接访问远程服务器上的资源,无需再通过其他复杂的网络连接方式。
二、快速上手
通过以下Python代码,你可以很快地在本地启动一条SSHTunnel:
from sshtunnel import SSHTunnelForwarder
import MySQLdb
with SSHTunnelForwarder(
('your-ssh-host', 22),
ssh_username='your-ssh-username',
ssh_password='your-ssh-password',
remote_bind_address=('your-remote-host', 3306)) as server:
conn = MySQLdb.connect(
user='your-db-username',
passwd='your-db-password',
db='your-database',
host='127.0.0.1',
port=server.local_bind_port)
cursor = conn.cursor()
cursor.execute('SELECT * FROM your-table')
print(cursor.fetchall())
conn.close()
其中,SSHTunnelForwarder是SSHTunnel的核心类,用于启动和管理SSH隧道。在创建SSHTunnelForwarder对象时,需要传入SSH服务器的地址、用户名、密码,以及目标远程服务器的地址和端口。使用with语句管理SSHTunnelForwarder对象的生命周期,确保隧道在使用完毕后正确关闭。
在启动SSHTunnel后,我们就可以通过在本地连接127.0.0.1:{server.local_bind_port}来访问远程服务器上的MySQL数据库了。
三、高级用法
SSHTunnel不仅仅只能用于访问MySQL数据库,还可以用来映射其他网络资源,比如Web服务、FTP、SMTP等。以下是一些高级用法示例:
1. 将本地端口映射到远程Web服务器
from sshtunnel import SSHTunnelForwarder
import requests
with SSHTunnelForwarder(
('your-ssh-host', 22),
ssh_username='your-ssh-username',
ssh_password='your-ssh-password',
remote_bind_address=('your-remote-host', 80)) as server:
res = requests.get(f'http://127.0.0.1:{server.local_bind_port}/your-url')
print(res.text)
这里我们使用Python中的requests库,访问本地选定的端口,将请求转发到远程服务器上。同样地,在SSHTunnelForwarder对象初始化时,我们需要指定远程服务器的地址和端口。这段代码中,我们将远程Web服务器的80端口转发到本地的{server.local_bind_port}端口,然后使用requests.get方法发送一个HTTP GET请求,并输出响应的内容。
2. 将远程FTP服务器映射到本地文件系统
from sshtunnel import SSHTunnelForwarder
import os
import ftplib
with SSHTunnelForwarder(
('your-ssh-host', 22),
ssh_username='your-ssh-username',
ssh_password='your-ssh-password',
remote_bind_address=('your-remote-host', 21)) as server:
ftp = ftplib.FTP()
ftp.connect('127.0.0.1', port=server.local_bind_port)
ftp.login(user='your-ftp-username', passwd='your-ftp-password')
ftp.cwd('your-ftp-dir')
for file in ftp.nlst():
print(f'Downloading {file}')
with open(os.path.join('your-download-dir', file), 'wb') as f:
ftp.retrbinary(f'RETR {file}', f.write)
ftp.quit()
这里我们使用Python自带的ftplib库来进行FTP传输。通过连接本地指定的端口和传输协议,我们可以将远程FTP服务器映射到本地的文件系统中。在执行了ftp.login方法以后,就可以像普通的FTP客户端一样访问服务器中的文件了。
四、总结
通过SSHTunnel,我们可以方便地将本地端口映射到远程服务器,以便于访问远程网络资源。在实际开发中,我们可以将此技术应用于各种场景,比如调试远程服务、访问远程数据库等。SSHTunnel是一个优秀的Python库,它提供了一种易于使用的方式,让我们可以轻松地管理SSH隧道,并在本地访问远程服务器上的资源。
原创文章,作者:MUJVK,如若转载,请注明出处:https://www.506064.com/n/351520.html
微信扫一扫
支付宝扫一扫