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