Si bien es cierto que set_combine_stderr
desvía stderr
a la corriente stdout
, lo hace con el fin caótica, por lo que no consigue el resultado es probable que desee, es decir, las líneas combinadas en el orden escrito, como si se estuviera ejecutando el comando en una ventana de terminal local. En su lugar, use get_pty
. Eso hará que el servidor ejecute las líneas a través de un pseudo-terminal, manteniéndolo en secuencia cronológica.
Aquí hay un programa de prueba, outerr.py
, que escribe líneas alternas en stdout
y stdin
. Supongamos que está en el directorio principal de llmps @ meerkat2.
#!/usr/bin/env python
import sys
for x in xrange(1, 101):
(sys.stdout, sys.stderr)[x%2].write('This is line #%s, on std%s.\n' %
(x, ('out', 'err')[x%2]))
Ahora intenta el código siguiente para ejecutar de forma remota:
#!/usr/bin/env python
import paramiko
def connect():
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('meerkat2', username='llmps', password='..')
return ssh
def runTest(ssh):
tran = ssh.get_transport()
chan = tran.open_session()
# chan.set_combine_stderr(True)
chan.get_pty()
f = chan.makefile()
chan.exec_command('./outerr.py')
print f.read(),
if __name__ == '__main__':
ssh = connect()
runTest(ssh)
ssh.close()
Si ejecuta lo anterior, debería ver 100 líneas con el fin como está escrito. Si, en cambio, usted comenta la llamada chan.get_pty()
y elimina el comentario de la llamada chan.set_combine_stderr(True)
, obtendrá grupos de líneas stdout
y stderr
intercaladas al azar de la ejecución a la ejecución.