Я создал 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? Есть ли способ получить текст командной строки?
Переменная $ PS1 не имеет значения при вводе оболочки ящиков BusyBox на модемах, разве вы не ожидаете, что echo $ PS1 отобразит «#». Также я читаю все, начиная с STDERR, и командная подсказка не появляется. – Evan
Нет, я бы не ожидал, что 'echo '$ PS1" 'обязательно отобразит что-нибудь -' PS1' требуется для выполнения, если он существует, но он не требуется для существования. Этот busybox использует '#', а не '$' по умолчанию при запуске, поскольку root нарушает POSIX, но соответствует традиционным соглашениям и, следовательно, также неудивительно. –
Что касается еще не видя подсказки, когда вы пытаетесь прочитать stderr ... ну, вы не предоставляете репродуцирующее устройство, так что сказать сложно. Возможно, вы не настраиваете канал таким образом, чтобы назначить TTY. Может быть, вы блокируете другое чтение в другом месте. Я мог продолжать размышлять до тех пор, пока у меня было терпение, и у меня есть даже вероятность угадать, где находится ваша реальная ошибка. Но, работая как интерактивная оболочка с TTY, пепел совершенно наверняка пишет подсказки для stderr, а не стандартный вывод. –