#character-encoding #python-3.x #telnet #subprocess
#кодировка символов #python-3.x #telnet #подпроцесс
Вопрос:
Я пытаюсь использовать Popen для автоматизации простого сеанса telnet. В Python 2.6.5 работает следующий код:
openCmd = subprocess.Popen("telnet 192.168.1.1", shell=True, stdout=PIPE, stdin=PIPE)
time.sleep(1)
openCmd.stdin.write("usernamer")
time.sleep(1)
openCmd.stdin.write("passwordr")
time.sleep(1)
openCmd.stdin.write("some commandr")
openCmd.terminate()
В python 3 он жаловался на ошибку типа, поэтому я решил, что мне просто нужно добавить .encode() в конец каждого объекта str (как показано ниже). Добавление .encode () исправило ошибку типа, и я не получаю никаких исключений, но команда, которую я пытаюсь запустить на удаленном компьютере, не выполняется.
openCmd = subprocess.Popen("telnet 192.168.1.1", shell=True, stdout=PIPE, stdin=PIPE)
time.sleep(1)
openCmd.stdin.write("usernamer".encode())
time.sleep(1)
openCmd.stdin.write("passwordr".encode())
time.sleep(1)
openCmd.stdin.write("some commandr".encode())
openCmd.terminate()
Я также пробовал .encode («ascii») и .encode («UTF-8»). Что я делаю неправильно? Я полагаю, что проблема связана с кодировкой, но я не знаю наверняка… Я запускаю эту программу на компьютере под управлением Ubuntu 10.04.
Комментарии:
1. @agf Нет обратной трассировки — команда, которую я пытаюсь запустить на удаленном компьютере, просто не выполняется.
Ответ №1:
По-видимому, все, что мне нужно было сделать, это переспать с этим. Оказывается, что в Python 2.6.5 каждый
Popen.stdin.write()
Задержка перед сбросом буфера была короче, чем в Python 3! Вот окончательная рабочая программа:
def writeImmeadiatelyToPopen(openCmd, textToWrite):
openCmd.write(textToWrite.encode())
openCmd.flush()
openCmd = Popen("telnet 192.168.1.1", shell=True, stdout=PIPE, stdin=PIPE)
time.sleep(1)
writeImmeadiatelyToPopen(openCmd, "usernamen")
time.sleep(1)
writeImmeadiatelyToPopen(openCmd, "passwordn")
time.sleep(1)
writeImmeadiatelyToPopen(openCmd, "some commandn")
openCmd.terminate()
На случай, если кому-то интересно, я выяснил, как это работает, запустив Popen против ‘cat’ и внимательно просмотрев выходные данные в Python 2.6.5 и Python 3 ^_ ^ .
Ответ №2:
Используйте python.pexpect для автоматизации сеанса telnet в Linux.
Комментарии:
1. Белый это может быть один из способов, который все еще не решает мою проблему с Popen, работающим не так, как я ожидаю.