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() 
Другие вопросы по тегам