Python SFTP连接中断时如何获取通知以判定故障是否来自服务端
解决方案
核心逻辑说明
当SFTP连接意外断开时,你可以通过异常捕获机制收到明确的文本提示,直接区分错误是否和服务器相关:
- paramiko在连接中断、认证失败、服务端无响应等场景下都会抛出特定异常,捕获对应异常类型就能判断错误来源
- 连接建立阶段抛出的
AuthenticationException、密钥文件不存在类错误,多和本地配置有关 - 连接建立成功后操作阶段抛出的
socket.error、EOFError,大概率是服务端连接中断、网络波动等服务/网络侧问题
- 连接建立阶段抛出的
- 注意:paramiko的空闲连接默认不会主动发送心跳检测断开状态,需要执行一次轻量SFTP操作才会触发断开异常
调整后可实现断开告警的代码
import paramiko import time import socket def connSFTP(ssh_key_filepath,host,user): try: k = paramiko.RSAKey.from_private_key_file(ssh_key_filepath) c = paramiko.SSHClient() c.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 新增超时设置,避免无限制等待服务端响应 c.connect(hostname=host, username=user, pkey=k, timeout=10) sftp = c.open_sftp() return sftp, c except FileNotFoundError: print("【本地错误】SSH密钥文件不存在,请检查路径配置") return None, None except paramiko.AuthenticationException: print("【配置错误】密钥认证失败,请检查账号、密钥权限是否正确") return None, None except (paramiko.SSHException, socket.timeout): print("【服务端/网络错误】无法建立SSH连接,可能是服务端宕机、网络不通或地址配置错误") return None, None def main(): ssh_key_filepath = '/home/dtv/.ssh/id_rsa' hostname = 'HostAdress' username = 'user' sftp, ssh_client = connSFTP(ssh_key_filepath,hostname,username) if not sftp: return print('Connected') time.sleep(30) # 执行轻量操作检测连接状态 try: sftp.listdir('/') print("连接正常") except (EOFError, socket.error, paramiko.SSHException): print("【服务端相关错误】连接已中断,为服务端主动断开或网络波动导致") finally: if sftp: sftp.close() if ssh_client: ssh_client.close() if __name__ == '__main__': main()
效果验证
你手动模拟断开连接后,休眠结束执行sftp.listdir就会触发对应异常,打印预设的文本通知,直接就能判断是否为服务端相关错误。
内容的提问来源于stack exchange,提问作者Mahmoud Abdulkarim
相关产品推荐
相关产品推荐

