使用paramiko防止SFTP/SSH会话超时

11

我正在使用paramiko连接到一个SFTP服务器上,需要下载和处理一些文件。

该服务器设置了5分钟的超时时间,但有些日子处理文件可能需要比超时时间更长。因此,当我想要改变服务器上的工作目录以处理其他文件时,sftp.chdir(target_dir))会引发连接超时的异常:

文件 buildbdist.win32eggparamikosftp://ftp.py, 第138行,_write_all函数中,raise EOFError()

为了解决这个问题,我认为启用保持活动状态是最好的选择,所以我在传输上使用了“set_keepalive”将其设置为30秒:

ssh = paramiko.SSHClient()
ssh.set_missing_hostkey_policy(paramiko.AutoAddPolicy())
ssh.connect(ssh_server, port=ssh_port, username=ssh_user, password=password)
transport = ssh.get_transport()
transport.set_keepalive(30)
sftp = transport.open_sftp_client()

但是什么也没有改变。这个更改绝对没有效果。我不知道是否我误解了set_keepalive的概念,或者可能是服务器(我无法访问)忽略了 keep alive 数据包。

这难道不是解决问题的正确方法吗?还是我应该尝试其他方法?我不喜欢“手动”发送一些ls命令来保持会话活动状态的想法。


1
服务器忽略保活数据包。它们仅用于防止网络连接超时。 - JimB
1个回答

6
如果服务器因为不活动而超时,客户端没有太多可以做的事情(除了可能每隔一段时间发送一个简单的命令以防止会话超时)。
您是否考虑过将下载和处理步骤分开,以便您可以先下载所有需要的内容,然后异步地或在所有下载完成后进行处理?

好的,我明白了。我也在考虑重新设计流程,使处理/下载变成异步的,但这需要相当多的工作,而我目前没有时间。看来我很不幸,使用“保持连接”解决方案行不通。另一个尝试我可以尝试的方法是,在注意到会话已超时时重新连接到服务器。 - Patric
是的,重新连接将是一个好的解决方案。您可以在出现socket.error和EOFError时重新连接,这应该就足够了。 - Steve Mayne
还有如何捕捉断开连接的方法? - Gulzar
为什么“偶尔发送一个简单的命令”没有任何作用?我该如何使用paramiko干净地完成这个任务?为什么Keepalive不只是这样? - Gulzar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接