Paramiko 是一个广泛用于 Python 开发的 SSH2 协议的客户端和服务器库,它提供了对安全外壳协议 (SSH) 和安全文件传输协议 (SFTP) 的支持,却不支持非安全的 Telnet 和 FTP 协议。
在某些情况下,我们需要使用现有的 Python 代码来连接到一些主机,这些主机不支持安全连接,并且我们对这些主机没有控制权。此时,我们需要在 Paramiko 中支持非安全的 Telnet 和 FTP 协议,或者退而求其次,创建一个抽象层来支持 Paramiko 和 Python 的 FTP 库,并重构代码以使用这个抽象层。
2. 解决方案
经过调查,我们发现 Paramiko 确实不支持 Telnet 和 FTP 协议,因此我们需要采用第二种解决方案:创建抽象层来支持 Paramiko 和 Python 的 FTP 库,并重构代码以使用这个抽象层。
2.1 创建抽象层
我们可以创建一个名为 Connection
的抽象基类,它定义了连接到远程主机的通用方法。这个基类可以包含一些常用的方法,例如 connect()
, send()
, receive()
等。
2.2 实现 Paramiko 和 FTP 库的适配器
接下来,我们可以分别为 Paramiko 和 Python 的 FTP 库实现两个适配器类。这些适配器类将继承 Connection
基类,并实现其方法。
2.2.1 Paramiko 适配器
import paramiko
class ParamikoAdapter(Connection):
def __init__(self, hostname, port, username, password):
self.hostname = hostname
self.port = port
self.username = username
self.password = password
def connect(self):
self.client = paramiko.SSHClient()
self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self.client.connect(self.hostname, self.port, self.username, self.password)
def send(self, data):
self.client.send(data)
def receive(self):
return self.client.recv(1024)
2.2.2 FTP 库适配器
import ftplib
class FtpAdapter(Connection):
def __init__(self, hostname, port, username, password):
self.hostname = hostname
self.port = port
self.username = username
self.password = password
def connect(self):
self.client = ftplib.FTP()
self.client.connect(self.hostname, self.port)
self.client.login(self.username, self.password)
def send(self, data):
self.client.sendcmd(data)
def receive(self):
return self.client.recv(1024)
2.3 重构代码
最后,我们可以将现有的代码重构为使用 Connection
抽象类及其适配器。这将允许我们使用相同的代码连接到支持 SSH 和 FTP 的主机,而无需担心底层协议的差异。
from connection import Connection, ParamikoAdapter, FtpAdapter
# Create an instance of the appropriate adapter based on the protocol
if protocol == "ssh":
adapter = ParamikoAdapter(hostname, port, username, password)
elif protocol == "ftp":
adapter = FtpAdapter(hostname, port, username, password)
# Connect to the remote host
adapter.connect()
# Send data to the remote host
adapter.send(data)
# Receive data from the remote host
data = adapter.receive()
通过这种方法,我们可以轻松地支持使用 Paramiko 的 SSH 和 FTP 连接,而无需修改现有的代码。