Estoy depurando algún código, lo que me va a hacer entrar y salir constantemente de algunos servidores externos de sftp. ¿Alguien sabe si paramiko cierra automáticamente una sesión ssh/sftp en el servidor externo si se genera una excepción que no sea paramiko en el código? No puedo encontrarlo en los documentos y, como las conexiones se tienen que hacer bastante temprano en cada iteración, no quiero terminar con 20 conexiones abiertas.¿Paramiko cierra la conexión ssh en una excepción que no es paramiko?
9
A
Respuesta
15
No, paramiko no cerrará automáticamente la sesión ssh/sftp. No importa si la excepción fue generada por el código de paramiko o de otra manera; no hay nada en el código de paramiko que capte ninguna excepción y automáticamente los cierra, por lo que tiene que hacerlo usted mismo.
Puede asegurarse de que se cierra envolviéndolo en un try/finally así:
client = None
try:
client = SSHClient()
client.load_system_host_keys()
client.connect('ssh.example.com')
stdin, stdout, stderr = client.exec_command('ls -l')
finally:
if client:
client.close()
3
SSHClient() se puede utilizar como un gestor de contexto, lo que puede hacer
with SSHClient() as ssh:
ssh.connect(...)
ssh.exec_command(...)
y no se cierra manualmente.
Cuestiones relacionadas
- 1. python paramiko ssh
- 2. Sesión anidada SSH con Paramiko
- 3. ¿Cómo transferir un archivo al servidor ssh en una conexión ssh hecha por paramiko?
- 4. paramiko "Servidor desconocido"
- 5. paramiko AuthenticationException tema
- 6. paramiko (pitón)
- 7. Ejecutando comandos interactivos en Paramiko
- 8. instalar paramiko en Windows
- 9. Desactivación de la tala en paramiko
- 10. ¿Cómo cambio directorios usando Paramiko?
- 11. Paramiko y Pseudo-tty Asignación
- 12. paramiko combinar stdout y stderr
- 13. paramiko Parche ssh incompatible (sin algoritmo kex aceptable)
- 14. obtener PID de paramiko
- 15. Paramiko y sudo
- 16. ¿Cómo hacer una conexión ssh con python?
- 17. ¿Admite Paramiko telnet y ftp no seguros en lugar de solo SSH y SFTP?
- 18. sshclient paramiko con sftp
- 19. 'Poner' en SFTP usando PAramiko
- 20. Transferencias de directorio en paramiko
- 21. Solución de hilo de limpieza en paramiko
- 22. Problemas al intentar SSH en una nueva instancia de EC2 con Paramiko
- 23. Prevenir el tiempo de espera de sesión SFTP/SSH con paramiko
- 24. La creación de múltiples conexiones SSH a la vez usando paramiko
- 25. Paramiko: Bloques de tuberías para siempre en lectura
- 26. paramiko SSH exec_command (script de shell) devuelve antes de la finalización
- 27. ¿Cómo ejecutar sudo con paramiko? (Python)
- 28. Paramiko equivalente de controles pipline y tubos de entrada/salida
- 29. Error de Paramiko: Error al leer el banner del protocolo SSH
- 30. ¿DataAdapter.Fill() cierra su conexión cuando se lanza una excepción?
Gracias, el problema fue que estaba depurando unas pocas miles de líneas de código (y aún estoy agregando). Las excepciones no fueron planteadas por paramiko sino por 'subprocess' o' os' etc. cuando algo salió mal en otro lado. Supongo que podría poner un 'client.close()' en cada excepción, pero eso no es muy bonito. – Ben
Si coloca las llamadas a 'subprocess' o' os' dentro del bloque 'try', se llamará siempre al bloque' finally' independientemente de lo que haya generado la excepción. Si quieres que sea un poco más bonita, podrías envolver al cliente en un 'Context Manager' y usar la declaración' with'. http://docs.python.org/reference/datamodel.html#context-managers – aculich
¡Ese señor es un punto tan +1! No responde la pregunta y no tiene sentido poner cada cosa individual en un bloque de "prueba ... finalmente" si todo lo de finalmente es lo mismo. Pero no hay nada de malo en poner la llamada a la clase dentro de una, así que siempre la cierro limpiamente. – Ben