سؤال

أرغب في تنفيذ بعض البرامج من خلال SSH وإعادة توجيه مدخلاته من ملف. سلوك الكود التالي:

channel.exec_command('cat')
with open('mumu', 'r') as f:
    text = f.read()
    nbytes = 0
    while nbytes < len(text):
        sent = channel.send(text[nbytes:])
        if sent == 0:
            break
        nbytes += sent

يجب أن يكون مكافئًا لـ (على افتراض مصادقة المفتاح العام):

 ssh user@host cat < mumu

ومع ذلك ، فإن التطبيق معلق في انتظار المزيد من المدخلات. أعتقد أن هذا يحدث لأن تيار stdin لم يتم إغلاقه أبدًا. كيف يمكنني فعل ذلك؟

هل كانت مفيدة؟

المحلول

يتصل shutdown() (أو shutdown_write()) على القناة.

نصائح أخرى

استدعاء الطريقة: channel.shutdown_write().

بما أنني لم أستخدم قناة بشكل صريح ، كان عليّ أن أفعل ذلك بشكل مختلف قليلاً. لمن قد يجدها مفيدة:

client = paramiko.SSHClient()
connection = client.connect(hostname)
stdin, stdout, stderr = connection.exec_command('cat')
stdin.write('spam')
# Close the channel, this results in an EOF for `cat`.
stdin.channel.shutdown_write()
# stdout/stderr are readable.
print(stdout.read().decode())
print(stderr.read().decode())
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top