2011-03-23 19 views
7

Bazı dosyaları indirmek ve işlemek zorunda olduğum bir SFTP sunucusuna bağlanmak için paramiko kullanıyorum.Paramiko ile SFTP/SSH oturum zaman aşımını önleyin

Sunucunun 5 dakikaya ayarlı bir zamanaşımı vardır, ancak bazı günlerde dosyaların işlenmesi zaman aşımından daha uzun sürebilir. Yani, ben bağlantı zaman aşımına uğradı bunun bir istisna olsun diğer bazı dosyaları sftp.chdir(target_dir)) işlemek için sunucudaki çalışma dizinini değiştirmek istiyorum:

Dosya buildbdist.win32eggparamikosftp: //ftp.py, çizgi

: 138, _write_all içinde EOFError hatası()

bunu engellemek için zam yani 30 saniyeye ayarlamak için taşıma "set_keepalive" kullanılan yüzden tutmak hayatta aktive iyi seçenek olacağını düşündüm

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() 

Ancak hiçbir şey değişmez. Değişimin kesinlikle bir etkisi yoktur. set_keepalive kavramını yanlış anladığımı veya belki de (erişemediğim) sunucunun no'lu telefonu paketlerini canlı tuttuğunu bilmiyorum.

Bu sorunu çözmek için doğru yöntem değil midir yoksa farklı bir yaklaşım mı denemeliyim? Oturumu canlı tutmak için sunucuya "el ile" ls komutunu göndermekten hoşlanmıyorum.

+1

Kalıcı paketler sunucumdan yoksayıldı. Sadece ağ bağlantılarını zaman aşımından korumak içindir. – JimB

cevap

3

Eğer sunucu hareketsizlik nedeniyle zaman aşımına uğruyorsa, istemci tarafında yapabileceğiniz fazla bir şey yoktur (oturumunuzu zaman aşımına uğratmak için her seferinde basit bir komut göndermeniz gerekebilir).

İndirme ve işleme adımlarınızı birbirinden ayırmayı düşündünüz mü, başlangıç ​​için ihtiyacınız olan her şeyi karşıdan yükleyebilir, daha sonra eşzamansız olarak veya tüm yüklemeler tamamlandıktan sonra işleyebilirsiniz.

+0

tamam, anlıyorum. Ayrıca, işlemin yeniden tasarlanmasını, böylece işlemin/yüklemenin asenkron olduğunu düşünmekteydim, ancak şu an için hiç zamanım olmadığı bir iş olurdu. Görünüşe göre, "hayatta kal" olan çözüm işe yaramayacak. Denemek istediğim başka bir girişimde, oturumun zaman aşımına uğradığını fark ettiğimde sunucuya yeniden bağlanılması gerekebilir. – Patric

+0

Evet, yeniden bağlanma iyi bir çözüm olurdu. Socket.error ve EOFError'a tekrar bağlanabilirsiniz ve bu yeterli olmalıdır. –

İlgili konular