如何解决Python-通过SSL套接字的Paramiko客户端-非阻塞问题
我编写了一些Python代码,使用户可以使用编辑的HTML文件更新服务器并上传图像。但是我在连接时遇到了一些问题。
在服务器端,我正在VMware中的运行HAproxy的pfSense路由器后面运行Ubuntu虚拟机。代理使拥有正确客户端证书的用户可以通过SSH进入正确的计算机。现在,它已经运行了很长一段时间,没有任何问题。
我认为我的问题是,在我的SFTP代码中,由于SSL包装没有被非阻塞,套接字被关闭了。但是,我无法思考或找到一种方法来修复我的代码。特别是因为我不是使用这些软件包的专家。 Paramiko客户端和SFTP客户端都已在具有VPN连接的远程服务器上分别进行了测试,在这种情况下它们可以正常工作。 SSL套接字使用的证书也可以正常工作。
版本:
的Python:3.8.3
openssl:1.1.1.f
paramiko:2.7.2
import socket
import ssl
import paramiko
class GE_SFTP_Client:
def __init__(self,Username,Password):
self.Username = Username
self.Password = Password
context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH) # Verify Server cert
context.load_cert_chain(certfile=_client_cert,keyfile=_client_key) # Load Client cert
context.set_alpn_protocols(['ssh/2.0'])
self.s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.conn = context.wrap_socket(self.s,server_side=False,server_hostname=_target_host)
self.conn.connect((_proxy_host,_proxy_port))
self.client = paramiko.SSHClient()
self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self.connected_status = False
SSH_Connection_Tries = 0
while SSH_Connection_Tries < 4: # Try 4 times to connect.
try:
self.client.connect(
hostname=_target_host,username=self.Username,password=self.Password,sock=self.conn,timeout=200,banner_timeout=200,auth_timeout=200
)
self.connected_status = True
break
except:
SSH_Connection_Tries += 1
pass
if self.connected_status:
self.sftp = self.client.open_sftp()
def GE_SFTP_ClientEnd(self):
try:
self.sftp.close()
except AttributeError:
pass
self.client.close()
self.conn.close()
self.s.close()
使用paramiko SFTP客户端获取(获取一些图像)时的输出示例。
succes! /images/fulls/3.jpg
succes! /images/fulls/2.jpg
succes! /images/fulls/9.jpg
Socket exception: A non-blocking socket operation could not be completed immediately (10035)
谢谢,您的任何建议将不胜感激!
解决方法
我离开了使用SSL软件包中的标准SSL包装器的想法,发现了一种不同的处理方式,即asyncssh软件包与asyncio结合使用。由于在一起,他们为我提供了解决此问题的必要工具。
现在,即使下载较大的文件,连接也更加稳定。我希望这也可以对其他人有所帮助! :)
var optionalAttachment = DriveApp.getFileById(optionalAttachmentCell).getBlob();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。