2014-12-09 7 views
0

Я создал Python GUI, который принимает список команд в качестве входных данных и выполняет список через сеанс Telnet или SSH. В то время как открытие SSH сессии (с использованием Paramiko в Python) Я выполнять команды на различных устройствах, используя этот код в цикле:busybox ash через paramiko not emitting prompt on stdout

    stdin.write(command+"\n") 
        then = time.time() 
        timeout=10.0 
        while not stdout.channel.exit_status_ready(): 

         if timeout is not None: 
          timeTest =time.time() - then 
          if timeout <= timeTest: 
           break 

        # Only print data if there is data to read in the channel 
         if stdout.channel.recv_ready(): 

          # Write data from stdout 
          temp=str(stdout.channel.recv(1024)) 
          print temp 
          if (temp.endswith(delim)) or (temp.endswith("# ")) : 
           print "successful exit" 
           break 

код предназначен для использования на модемы, которые установлены BusyBox. Таким образом, пользователю обычно нужно вводить команду для открытия busybox и запуска последовательности команд в оболочке BusyBox. Как вы можете видеть в этой строке кода «if (temp.endswith (delim)) или (temp.endswith (« # »))« цикл while должен прерываться, когда обнаруживается командная строка busybox, которая является " # "(это означает, что команда завершила вывод).

Проблема, с которой я столкнулась, заключается в том, что BusyBox не печатает командную строку на stdout или в строке отладки «temp temp». Почему это? Выходы команды (пример ls -l) успешно печатаются на stdout, но не в командной строке или в вложенном сообщении busybox: когда пользователь вводит busybox на этих модемах, выводится вступительное сообщение «BusyBox v1.17.2 (2014-10-02) 10:50:35 PDT) встроенная оболочка (зола) Введите «help» для списка встроенных команд ». который также не печатается в STDOUT. Это вынуждает код использовать тайм-аут для каждой команды, выполняемой в busybox, что нежелательно, то есть оно медленное, и могут быть выходные команды, которые занимают больше времени, чем требуемый тайм-аут, поэтому лучше всего искать командную строку.

Этот вопрос связан с внедрением пепла в BusyBox? Есть ли способ получить текст командной строки?

ответ

0

Во-первых: Если вы пытаетесь распознать приглашения оболочки при программном использовании оболочки, вы делаете это неправильно.

Если вы используете exec_command() на новом канале (над тем же транспортом) для каждой команды, которую вы хотите запустить, вы получите отдельную команду stdout, stderr и т. Д. Для каждой команды; имеют статус выхода для этой команды, о котором сообщается отдельно, и никогда не нужно угадывать, является ли часть результата из команды или из внешней оболочки.

Во-вторых: Если вы действительно хотите сделать это таким образом (! И, опять же, вы не должны), вы должны использовать invoke_shell() после get_pty() вызова, не exec_command('sh').

0

См записи на PS1 (переменный, указывающий запрос на испускает) в IEEE standard 1003.1 (курсив):

PS1

Каждый раз, когда интерактивная оболочка готова для считывания команды, значение этой переменной должны быть подвергнуты расширению параметров, а записано на стандартную ошибку. Значение по умолчанию должно быть «$». Для пользователей с определенными дополнительными привилегиями, определяемыми реализацией, по умолчанию может быть другое значение, определяемое реализацией. Оболочка заменяет каждый экземпляр символа '!' в PS1 с номером файла истории следующей команды для ввода. Убегая '!' с другим '!' (т. е. «!!») помещает буквенный символ «!» в подсказке. Этот объем POSIX.1-2008 определяет влияние переменной только для систем, поддерживающих параметр Утилиты пользовательской переносимости.

Таким образом, любая POSIX-совместимая оболочка - не просто BusyBox пепел, но КШ, тир, баш, а все остальные - должна написать свой запрос на stderr, не stdout.


Ваше простое исправление, то это либо читать stderr или использовать перенаправление для объединения потоков (работающие exec 2>&1, например).

+0

Переменная $ PS1 не имеет значения при вводе оболочки ящиков BusyBox на модемах, разве вы не ожидаете, что echo $ PS1 отобразит «#». Также я читаю все, начиная с STDERR, и командная подсказка не появляется. – Evan

+0

Нет, я бы не ожидал, что 'echo '$ PS1" 'обязательно отобразит что-нибудь -' PS1' требуется для выполнения, если он существует, но он не требуется для существования. Этот busybox использует '#', а не '$' по умолчанию при запуске, поскольку root нарушает POSIX, но соответствует традиционным соглашениям и, следовательно, также неудивительно. –

+0

Что касается еще не видя подсказки, когда вы пытаетесь прочитать stderr ... ну, вы не предоставляете репродуцирующее устройство, так что сказать сложно. Возможно, вы не настраиваете канал таким образом, чтобы назначить TTY. Может быть, вы блокируете другое чтение в другом месте. Я мог продолжать размышлять до тех пор, пока у меня было терпение, и у меня есть даже вероятность угадать, где находится ваша реальная ошибка. Но, работая как интерактивная оболочка с TTY, пепел совершенно наверняка пишет подсказки для stderr, а не стандартный вывод. –

 Смежные вопросы

  • Нет связанных вопросов^_^