2011-03-23 19 views
7

Estoy usando paramiko para conectarme a un servidor SFTP en el que tengo que descargar y procesar algunos archivos.Prevenir el tiempo de espera de sesión SFTP/SSH con paramiko

El servidor tiene un tiempo de espera establecido en 5 minutos, pero algunos días sucede que el procesamiento de los archivos puede tomar más tiempo que el tiempo de espera. Por lo tanto, cuando quiero cambiar el directorio de trabajo en el servidor para procesar algunos otros archivos sftp.chdir(target_dir)) que recibo una excepción que la conexión ha caducado:

Archivo buildbdist.win32eggparamikosftp: //ftp.py, línea 138, en _write_all aumentar EOFError()

para contrarrestar esto pensé que la activación de la vida mantener sería la mejor opción, así que utiliza el "set_keepalive" en el transporte para establecerlo en 30 segundos:

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

Pero nada cambia en absoluto. El cambio no tiene absolutamente ningún efecto. No sé si estoy entendiendo mal el concepto de set_keepalive aquí o tal vez el servidor (en el que no tengo acceso) ignora los paquetes keep alive.

¿No es esta la manera correcta de contrarrestar este problema o debería intentar un enfoque diferente? No me gusta la idea de enviar "manualmente" un comando ls al servidor para mantener la sesión activa.

+1

Los paquetes de Keepalive se ignoran en el servidor. Son solo para evitar que las conexiones de red excedan el tiempo de espera. – JimB

Respuesta

3

Si el servidor le está agotando la inactividad, no hay mucho que pueda hacer desde el lado del cliente (aparte de enviar un comando simple de vez en cuando para evitar que su sesión se agote).

¿Ha considerado separar sus pasos de descarga y procesamiento, para que pueda descargar todo lo que necesita para empezar, luego procesarlo de forma asincrónica o después de que se hayan completado todas las descargas?

+0

bien, ya veo. También estaba pensando en un rediseño del proceso para que el procesamiento/descarga sea asíncrono, pero eso sería un poco de trabajo para el cual actualmente no tengo tiempo. Parece que no tengo suerte de que la solución con "keep alive" no funcione. Otro intento que podría intentar podría hacer una reconexión con el servidor cuando note que la sesión ha tenido un tiempo de espera. – Patric

+0

Sí, la reconexión sería una buena solución. Puede volver a conectar en socket.error y EOFError, y eso debería ser suficiente. –

Cuestiones relacionadas