Скрипт telnet на Python с вводом двух паролей для входа?

#python #telnet #telnetlib

#python #telnet #telnetlib

Вопрос:

Я впервые использую python, поэтому, пожалуйста, помогите … 🙂 Этот скрипт telnet отлично работает для меня, если я знаю правильный пароль, но включенный маршрутизатор 192.168.1.1 иногда загружается с паролем: password1 а иногда с паролем: password2 , и мне нужно, чтобы скрипт был полностью автоматизирован, поэтому пароли нужныдля чтения непосредственно из скрипта, потому что я хочу подключиться к telnet и войти в маршрутизатор, независимо от того, является ли пароль первым или вторым.

 import telnetlib
import time

router = '192.168.1.1'
password = 'password1'
username = 'admin'

tn = telnetlib.Telnet(router)
tn.read_until(b"Login: ")
tn.write(username.encode("ascii")   b"n")
tn.read_until(b"Password: ")
tn.write(password.encode('ascii')   b"n")
print("Successfully connected to %s" % router)
tn.write(b"sh ip int brin")
time.sleep(2)
print (type("output"))
output = tn.read_very_eager()
#print(output)
output_formatted = output.decode('utf-8')
print(output_formatted)
print("done")`
 

Как я могу изменить этот код, чтобы он опробовал второй пароль, если первый был неправильным, для успешного входа в систему через telnet в обоих случаях ( password1 или password2 )?

Ответ №1:

После ввода первого пароля tn.write(password...) вам необходимо определить, какой вывод соответствует правильному логину. Например, это может быть командная строка, заканчивающаяся на «ok>». Для неправильного пароля вам необходимо определить вывод, соответствующий другому запросу пароля, например, «Пароль:» снова или начиная снова с «Login: «.

Затем вы можете использовать expect() метод telnetlib для одновременного поиска этих 2 выходных данных, поместив их в список, например ["ok >", "Password: "] . Смотрите pydoc telnetlib . Этот метод возвращает кортеж (индекс в списке, объект соответствия, текст, прочитанный до совпадения). Единственный интересующий элемент — это первый, индекс; он будет равен 0, если было замечено «ok>», 1, если было замечено «Password:», или -1, если ни один из них не был замечен по некоторому заданному тайм-ауту. Вам просто нужно проверить это значение и действовать соответствующим образом.

 index, match, text = tn.expect([b"ok >", b"Password: "], timeout=10)
if index==-1:
 ... # oops, timeout
elif index==1:
 ... # need to send password2
else:
 ... # ok, logged in
 

Обратите внимание, передаваемые строки expect() компилируются в регулярные выражения, поэтому остерегайтесь использования специальных символов (см. pydoc re ).