Скрипт Pymi Paramiko, проблемы с чтением вывода во время exec_command () - PullRequest
11 голосов
/ 07 октября 2011

Справочная информация : я использую python и paramiko для автоматизации процесса, который я прохожу каждый раз, когда мне приходится сдавать программу для класса.Мы используем команду «handin» для отправки исходного кода, но это должно быть сделано со школьного компьютера.Поэтому, когда я отправляю код из дома, я должен: sftp на школьные серверы, поместить файлы в dir, ssh на школьный компьютер, использовать команду 'handin'

Я могу успешно поместить файлы на школьные машины.Проблема возникает, когда я пытаюсь использовать exec_command ('handin my files'), а затем читаю вывод для определения следующего действия.

, поэтому у меня есть

try:
   (stdin, stdout, stderr) = client.exec_command(s)
except:
   print 'whoops'
   sys.exit()
print stdout.readlines()

Но это вызывает тупикпо какой-то причине сценарий, похоже, ничего не делает, и мне приходится в конечном итоге завершить весь процесс (ctrl + c не работает).Я не уверен, что exec_command не завершается правильно (даже если он выходит из блока try / catch) или у меня проблемы с сетью или что.

Есть идеи?

обновление:

Проблема связана с взаимодействием с командой handin во время выполнения.После выполнения команды handin может работать, а может и не работать.Если это первая отправка, это говорит об успехе, бла-бла, и заканчивает выполнение.Все хорошо.Но если я отправляю повторно, я должен разрешить перезапись (stdin.write ('y')) для каждого файла.

TL / DR:

Какпроверить, работает ли еще exec_command (), ожидает ли ввод и readline () из stdout соответственно?

Ответы [ 4 ]

11 голосов
/ 07 октября 2011

Я не вижу ничего плохого в приведенном выше фрагменте кода. Приведенная ниже программа представляет собой полный скрипт, который регистрируется на хосте и запускает команду ls для просмотра файлов. Я только что попробовал, и это работает для меня. Возможно, попробуйте это и посмотрите, работает ли это для вас. Если это не работает, я подозреваю, что есть проблема, специфичная для вашего ssh-сервера, команды, которую вы запускаете, или установки paramiko. Если он действительно работает для вас, нужно просто внести изменения в него, чтобы перейти к существующей функциональности и посмотреть, где он сломается.

import paramiko
ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('<ip address here>',username='<username here>',password='<password here>')
stdin,stdout,stderr = ssh.exec_command("ls /")
print stdout.readlines()

Если это сработает, мое следующее предложение - попытаться заменить 'ls /' фактической командой handin, которую вы пытаетесь запустить. Возможно, команда зависает в ожидании ввода пользователя и т. Д.

6 голосов
/ 07 октября 2011

Проблема может заключаться в том, что удаленная команда ожидает ввода (она ожидает, что вы что-то напишите в stdin, не зная, что вы не собираетесь, пока вы не скажете об этом). Попробуйте stdin.channel.shutdown_write() (я думаю, stdin.close() само по себе не сработает: это вызовет только сброс)

0 голосов
/ 15 ноября 2018

Это старая тема, но я также видел эту проблему.Это связано с ошибкой в ​​Paramiko, из-за которой он не может обработать большой STDOUT из удаленной команды, поэтому он зависает.

Ссылка: https://github.com/paramiko/paramiko/issues/515

Возможное решение: https://gist.github.com/matjohn2/2c1c4988e17112a34f310667e0ff6e7e

0 голосов
/ 27 августа 2013

Чтобы обойти это и получить вывод Ifconfig, вы можете попробовать использовать опцию get_pty = True

например:

import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

def MonitorProcess():
    ssh.connect('10.2.0.230', username='ibmsys1', password='passw0rd', timeout=5)
    stdin, stdout, stderr = ssh.exec_command('/sbin/ifconfig', timeout=3, get_pty=True)
    #stdin, stdout, stderr = ssh.exec_command('/sbin/ifconfig') -> simple exec ex.
    print stdout.read()

MonitorProcess()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...