Python Telnet скрипт
Благодаря библиотеке Python я смог использовать их пример для связи с коммутаторами Cisco, я использую это для целей обучения, особенно для изучения Python.
Однако, хотя весь код, как правило, легко читается, я немного сбит с толку следующим:
1 - зачем использовать оператор if ниже 2- зачем использовать "\n" после метода записи имени пользователя и пароля 3- почему я не получаю вывод на моем терминале bash, когда изменения зафиксированы и выполнены успешно
HOST = "172.16.1.76"
user = raw_input("Enter your Telnet username : ")
password = getpass.getpass()
tn = telnetlib.Telnet(HOST)
tn.read_until("Username: ")
tn.write(user + '\n') <----- 2
if password: <----- 1
tn.read_until("Password: ")
tn.write(password + "\n") <------2
tn.write("show run \n")
time.sleep(5)
output = tn.read_all() <----- 3
print output
print "=" * 30
print "Configuration Complete."
Я не уверен, почему, используя приведенное выше утверждение if, обычно после ввода имени пользователя, вы получаете запрос пароля сразу после этого. почему мы не можем просто напечатать:
tn.read_until("Username: ")
tn.write(user + '\n')
tn.read_until("Password: ")
tn.write(password + "\n")
Что касается второго пункта, зачем использовать '\n' после паролей и имени пользователя в методе записи, если мы собираемся нажать клавишу ввода после того, как мы добавим их в любом случае?
3 ответа
1: линия
password = getpass.getpass()
запрашивает у вас пароль, если вы оставите его пустым, пароль будет содержать пустую строку, которая в выражении if совпадает с False
скрипт не знает заранее, есть ли у вас пароль на вашем сервере или нет, он имитирует знание, сначала спрашивая вас, и если вы ничего не вводите, он предполагает, что нет (в противном случае он застрянет на tn.read_until("Password: ")
навсегда.
2: '\n'
симулирует ваше нажатие клавиши возврата. например, при вводе пароля 'password<RETURN>'
переменная password не будет содержать завершающий символ новой строки (\n), поэтому она добавляется вручную
3: этот я не знаю, возможно 5 секунд не хватает времени ждать
После выполнения tn = telnetlib.Telnet(HOST) вы создали канал telnet с вашей машины на HOST. Но вам все равно нужно связаться с HOST, чтобы отправлять / отправлять ваши команды и получать результаты.
Чтобы отправить ваши команды в HOST, вам нужно выполнить tn.write("your_commands_or_input \n"), \n означает newline/return, который говорит, что ваши текущие команды должны быть выполнены сейчас. После выполнения HOST вернет результат, который будет перехвачен вашим объектом telnet "tn" и сохранен в его "локальном кэше", вы можете искать любые ключевые слова, которые вы ожидали в этом кэше, используя метод tn.read_until, если ожидаемое ключевое слово был найден, read_until остановится (всегда останавливается на 1-м найденном), и вы можете делать все, что вам нужно (теперь ваш ход), иначе read_until будет продолжать ждать выхода из HOST(вы еще не включили). Наконец, если вы хотите проверить, что все выходные данные кэшированы, вы можете выполнить tn.read_all().
Помните, что некоторые из HOST используют разные выходные данные для входа в систему, например, Имя пользователя против имени пользователя или Пароль против пароля, лучше использовать регулярные выражения для их сопоставления.
На github есть библиотека python, специально для телнетирования на устройства cisco.
pip install git+https://github.com/sergeyzelyukin/cisco-telnet.git
import ciscotelnet
with ciscotelnet.CiscoTelnet(host, verbose = False) as cisco:
if cisco.login(final_mode=CiscoTelnet.MODE_ENABLE, user="john", user_pass="12345678", enable_pass="cisco"):
# if cisco.login(final_mode=CiscoTelnet.MODE_ENABLE, line_pass="abcdef", enable_pass="cisco"):
print cisco.cmd("sh int status | inc Fa0/1")
print cisco.conf(["interface fast0/1", "descr blank", "load-interval 300"])
print cisco.wr()