Módulo paramiko de Python usando múltiples comandos

Tengo una clase que crea la conexión. Puedo conectar y ejecutar 1 comando antes de que se cierre el canal. En otro sistema que tengo, puedo ejecutar varios comandos y el canal no se cierra. Obviamente es un problema de configuración con los sistemas a los que estoy intentando conectar.

class connect: newconnection = '' def __init__(self,username,password): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: ssh.connect('somehost', username=username,password=password,port=2222,timeout=5) except: print "Count not connect" sys.exit() self.newconnection = ssh def con(self): return self.newconnection 

Entonces uso el comando ‘ls’ solo para imprimir algunos resultados

 sshconnection = connect('someuser','somepassword').con() stdin, stdout, stderr = sshconnection.exec_command("ls -lsa") print stdout.readlines() print stdout stdin, stdout, stderr = sshconnection.exec_command("ls -lsa") print stdout.readlines() print stdout sshconnection.close() sys.exit() 

Después de que se ejecute el primer exec_command, se imprime el resultado esperado de la lista dir. Cuando imprimo stdout después del primer exec_command parece que el canal está cerrado

 <paramiko.ChannelFile from  >> 

Como dije en otro sistema, puedo seguir ejecutando comandos y la conexión no se cierra. ¿Hay alguna manera de que pueda mantener esto abierto? ¿O una mejor manera puedo ver la razón por la que se cierra?

edición : Parece que solo se puede ejecutar 1 comando por SSHClient.exec_command … así que decidí obtener_transport (). open_session () y luego ejecutar un comando. El primero siempre funciona. El segundo siempre falla y los scripts simplemente cuelgan.

Con solo paramiko después de que exec_command ejecute, el canal se cerrará y ssh devolverá un indicador de autenticación.

Parece que no es posible con solo paramiko , prueba con fabric u otra herramienta.

** La fabric no funcionó demasiado .

Por favor vea la siguiente referencia, ya que proporciona una manera de hacer esto en Paramiko:

¿Cómo ejecutas múltiples comandos en una sola sesión en Paramiko? (Pitón)

Es posible con netmiko (probado en windows). Este ejemplo está escrito para conectarse a dispositivos Cisco, pero el principio es adaptable para otros también.

 import netmiko from netmiko import ConnectHandler import json def connect_enable_silent(ip_address,ios_command): with open ("credentials.txt") as line: line_1 = json.load(line) for k,v in line_1.items(): router=(k,v) try: ssh = ConnectHandler(**router[1],device_type="cisco_ios",ip=ip_address) ssh.enable() except netmiko.ssh_exception.NetMikoAuthenticationException: #incorrect credentials continue except netmiko.ssh_exception.NetMikoTimeoutException: #oddly enough if it can log in but not able to authenticate to enable mode the ssh.enable() command does not give an authentication error #but a time-out error instead try: ssh = ConnectHandler(username = router[1]['username'],password = router[1]['password'],device_type="cisco_ios", ip=ip_address) except netmiko.ssh_exception.NetMikoTimeoutException: # connection timed out (ssh not enabled on device, try telnet) continue except Exception: continue else: output = ssh.send_command(ios_command) ssh.disconnect() if "at '^' marker." in output: #trying to run a command that requires enble mode but not authenticated to enable mode continue return output except Exception: continue else: output = ssh.send_command(ios_command) ssh.disconnect() return output output = connect_enable_silent(ip_address,ios_command) for line in output.split('\n'): print(line) 

El texto de las credenciales está diseñado para almacenar diferentes credenciales en caso de que esté planeando llamar a esta función para acceder a múltiples dispositivos y no a todos usando las mismas credenciales. Está en el formato:

 {"credentials_1":{"username":"username_1","password":"password_1","secret":"secret_1"}, "credentials_2":{"username":"username_2","password":"password_2","secret":"secret_2"}, "credentials_3": {"username": "username_3", "password": "password_3"} } 

Las excepciones se pueden cambiar para hacer cosas diferentes, en mi caso, solo lo necesitaba para no devolver un error y seguir intentando el siguiente conjunto, por lo que la mayoría de las excepciones se silencian.