Se è vero che set_combine_stderr
devia stderr
al flusso stdout
, lo fa in modo caotico, quindi non si ottiene il risultato che probabilmente si desidera, vale a dire, le linee combinate in ordine scritto, come se si stesse eseguendo il comando in una finestra di terminale locale. Utilizzare invece get_pty
. Ciò farà sì che il server esegua le linee attraverso uno pseudo-terminale, mantenendole in sequenza cronologica.
Ecco un programma di prova, outerr.py
, che scrive linee alternate su stdout
e stdin
. Supponiamo che sia nella directory home di 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]))
Ora provare il seguente codice per eseguire da remoto:
#!/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()
Se si esegue quanto sopra, si dovrebbe vedere 100 linee in ordine come scritta. Se, invece, commentate la chiamata chan.get_pty()
e decommentate la chiamata chan.set_combine_stderr(True)
, otterrete gruppi di righe stdout
e stderr
interrotte in modo casuale da esecuzione a esecuzione.