tutorial invoke_shell example python ssh paramiko

python - invoke_shell - ¿Cómo puede obtener el código de retorno SSH usando Paramiko?



python ssh paramiko tutorial (4)

client = paramiko.SSHClient() stdin, stdout, stderr = client.exec_command(command)

¿Hay alguna forma de obtener el código de retorno del comando?

Es difícil analizar todo stdout / stderr y saber si el comando finalizó correctamente o no.


En mi caso, el buffer de salida fue el problema. Debido al almacenamiento en búfer, las salidas de la aplicación no salen de forma no bloqueante. Puede encontrar la respuesta sobre cómo imprimir la salida sin almacenarla aquí: Deshabilite el almacenamiento en búfer de salida . Para abreviar, simplemente ejecute python con la opción -u de esta manera:

> python -u script.py


Gracias por JanC, agregué algunas modificaciones para el ejemplo y las probé en Python3, realmente me resultan útiles.

import paramiko import getpass pw = getpass.getpass() client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.WarningPolicy()) #client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) def start(): try : client.connect(''127.0.0.1'', port=22, username=''ubuntu'', password=pw) return True except Exception as e: #client.close() print(e) return False while start(): key = True cmd = input("Command to run: ") if cmd == "": break chan = client.get_transport().open_session() print("running ''%s''" % cmd) chan.exec_command(cmd) while key: if chan.recv_ready(): print("recv:/n%s" % chan.recv(4096).decode(''ascii'')) if chan.recv_stderr_ready(): print("error:/n%s" % chan.recv_stderr(4096).decode(''ascii'')) if chan.exit_status_ready(): print("exit status: %s" % chan.recv_exit_status()) key = False client.close() client.close()


SSHClient es una clase de contenedor simple en torno a la funcionalidad de bajo nivel más en Paramiko. La documentación de API enumera un método recv_exit_status() en la clase Channel.

Una secuencia de comandos de demostración muy simple:

$ cat sshtest.py import paramiko import getpass pw = getpass.getpass() client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.WarningPolicy()) client.connect(''127.0.0.1'', password=pw) while True: cmd = raw_input("Command to run: ") if cmd == "": break chan = client.get_transport().open_session() print "running ''%s''" % cmd chan.exec_command(cmd) print "exit status: %s" % chan.recv_exit_status() client.close() $ python sshtest.py Password: Command to run: true running ''true'' exit status: 0 Command to run: false running ''false'' exit status: 1 Command to run: $


Un ejemplo mucho más fácil que no implica invocar la clase de canal directamente:

import paramiko client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(''blahblah.com'') stdin, stdout, stderr = client.exec_command("uptime") print stdout.channel.recv_exit_status() # status is 0 stdin, stdout, stderr = client.exec_command("oauwhduawhd") print stdout.channel.recv_exit_status() # status is 127