#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
).