Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Интерпретируемые языки _ Python + telnet

Автор: Я 26.9.2010, 21:54

Привет всем.
Хочу приконнектиться из python'а к железке по telnet'у.
Нашел полузную либу telnetlib. Нашел пример на сайте разработчика, подправил под свой, но работать не хочет. Пишет:

Цитата
Password:
^CTraceback (most recent call last):
File "./telnet.py", line 29, in <module>
print tn.read_all()
File "/usr/local/lib/python2.5/telnetlib.py", line 337, in read_all
self.fill_rawq()
File "/usr/local/lib/python2.5/telnetlib.py", line 528, in fill_rawq
buf = self.sock.recv(50)
KeyboardInterrupt


вот сам код уже исправленный:
import getpass
import sys
import telnetlib

HOST = "10.10.1.110"
#user = raw_input("Enter your remote account: ")
password = getpass.getpass()

tn = telnetlib.Telnet(HOST)

tn.read_until("Login: ")
tn.write("admin" + "\n")
if password:
    tn.read_until("Password:")
    tn.write( "\n")

tn.write("\n")
tn.write("logout\n")

print tn.read_all()


А это оригинал:
import getpass
import sys
import telnetlib

HOST = "localhost"
user = raw_input("Enter your remote account: ")
password = getpass.getpass()

tn = telnetlib.Telnet(HOST)

tn.read_until("login: ")
tn.write(user + "\n")
if password:
    tn.read_until("Password: ")
    tn.write(password + "\n")

tn.write("ls\n")
tn.write("exit\n")

print tn.read_all()


Заранее благодарен за отввет.

ЗЫ. Если не там создал - переместите, пожалуйста.
ЗЗЫ. Если тема поднималась ранее - ткните носом.

Автор: Kagami 26.9.2010, 23:39

Я питон не знаю, но судя по выводу ты сам нажал Ctrl+C для завершения программы. К тому же ты уверен что пароль на сервере для пользователя admin пустой? В твоем скрипте ты отправляешь только перевод строки.

Автор: Я 27.9.2010, 5:55

Цитата(Kagami @ 26.9.2010, 23:39) *
ты сам нажал Ctrl+C для завершения программы

Я полчаса ждал пока она выведет хоть что-то.
Цитата(Kagami @ 26.9.2010, 23:39) *
К тому же ты уверен что пароль на сервере для пользователя admin пустой? В твоем скрипте ты отправляешь только перевод строки.

Моя железка. :) Я уверен. В ответ на запрос пароля я отправляю ему перевод каретки, дабы эмулировать нажатие клавиши Enter.

Автор: Я 27.9.2010, 8:16

Собственно другой вопрос нарисовался.
как правильно передать пароль. Такое ощущение, что пароль не передается вообще.

Автор: alex977 27.9.2010, 14:25

http://python.su/forum/viewtopic.php?id=7726

Автор: Я 27.9.2010, 15:07

Проблему я решил. Устройство все успевает, только надо выпрямители рук подарить докописцам и людям, которые копипастят. Не знаешь что пишешь - не пиши. В общем объясняю.
В примерах, ввод команды заканчивается "\n", а надо использовать "\r".
Для незнающих поясняю:
В документации говорится, что "\n» - символ перехода на новую строку с внутренним кодом 0x0A, а "\r» - символ возврата каретки с внутренним кодом 0x0D. Получается, что устройства, к которым я пытался подключиться отлавливают именно 0x0D, а 0x0A просто добавляли вконец написанной строки.
И в итоге код получается таким:

#!/usr/bin/env python
import sys
import telnetlib
import time


tn = telnetlib.Telnet("10.10.0.1", 23) #подключаемся к узлу

tn.read_until("Router >") # отлавливаем приглашение, которое заканчивается "Router >"
tn.write("enable\r") # вводим команду (Обратить внимание на \r)

tn.read_until("Password:") #отлавливаем приглашение с вводом пароля
tn.write("my_pass\r") # вставляем пароль (Обратить внимание на \r)

tn.read_until("telnet@BigIron Router#") #отлавливаем приглашение, информирующее о входе в систему
tn.write("show chassis\r") # выполняем команду
s = tn.read_until(" C degrees") # считываем результат до определенного слова

print type(s) #навсякий случай узнаем что мы получили, а то мало ли

tn.close(); #закрываем сессию
print s


Вот так.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)