हालांकि यह सच है कि set_combine_stderr
stdout
धारा को stderr
ओर मोड़ देता है, यह अराजक क्रम में ऐसा नहीं करता है, तो आप परिणाम आप शायद चाहते हैं, अर्थात्, लाइनों के क्रम में संयुक्त लिखा, जैसे कि आप चल रहे थे नहीं मिलता स्थानीय टर्मिनल विंडो में कमांड। इसके बजाय, get_pty
का उपयोग करें। इससे सर्वर को छद्म-टर्मिनल के माध्यम से लाइनों को चलाने का कारण बनता है, जो उन्हें कालक्रम क्रम में रखता है।
यहां एक परीक्षण कार्यक्रम है, outerr.py
, जो stdout
और stdin
पर वैकल्पिक लाइनें लिखता है। मान लें कि यह 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]))
अब यह दूर से चलाने के लिए निम्नलिखित कोड का प्रयास करें:
#!/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()
आप ऊपर चलाते हैं, तो आप क्रम में 100 लाइनों देखना चाहिए के रूप में लिखा। यदि, इसके बजाय, आप chan.get_pty()
कॉल पर टिप्पणी करते हैं और chan.set_combine_stderr(True)
कॉल को असम्बद्ध करते हैं, तो आपको stdout
और stderr
लाइनों को यादृच्छिक रूप से रन से चलाने के लिए छेड़छाड़ की जाएगी।