2011-03-23 260 views
7

我正在使用paramiko連接到SFTP服務器,我必須下載並處理一些文件。用paramiko防止SFTP/SSH會話超時

服務器的超時設置爲5分鐘,但有些時候發生的情況是文件的處理時間可能會比超時時間長。所以,當我想改變服務器上的工作目錄來處理一些其他文件sftp.chdir(target_dir))我得到一個異常的連接超時:

文件 buildbdist.win32eggparamikosftp://ftp.py, 線138,在_write_all提高 的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的概念,或者可能是服務器(我無法訪問)忽略了保持活動數據包。

這不是正確的方法來解決這個問題,還是我應該嘗試不同的方法?我不喜歡「手動」將一些ls命令發送到服務器以保持會話存活的想法。

+1

Keepalive數據包在我的服務器上被忽略。它們僅用於保持網絡連接不會超時。 – JimB 2011-03-23 14:23:53

回答

3

如果服務器正在計時你處於非活動狀態,你可以從客戶端做很多事情(除了可能每隔一段時間發送一個簡單的命令以防止會話超時)。

您是否考慮拆分下載和處理步驟,以便您可以下載所需的所有內容,然後以異步方式或在所有下載完成後進行處理?

+0

好的,我明白了。我也在考慮對流程進行重新設計,以便處理/下載是異步的,但這對於我目前沒有時間的工作來說是相當有意義的。似乎我不幸的是,「保持活力」的解決方案將無法正常工作。當我發現會話有超時時,我可以嘗試另一次嘗試重新連接到服務器。 – Patric 2011-03-23 15:01:21

+0

是的,重新連接將是一個很好的解決方案。你可以重新連接socket.error和EOFError,這應該就足夠了。 – 2011-03-23 15:06:59