crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Python + telnet
Гость_Я_*
сообщение 26.9.2010, 21:54
Сообщение #1





Гости








    


Привет всем.
Хочу приконнектиться из 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
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 601
Регистрация: 2.2.2009
Пользователь №: 523

Спасибо сказали: 101 раз(а)




Репутация:   9  


Я питон не знаю, но судя по выводу ты сам нажал Ctrl+C для завершения программы. К тому же ты уверен что пароль на сервере для пользователя admin пустой? В твоем скрипте ты отправляешь только перевод строки.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Я_*
сообщение 27.9.2010, 5:55
Сообщение #3





Гости








    


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

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

Моя железка. :) Я уверен. В ответ на запрос пароля я отправляю ему перевод каретки, дабы эмулировать нажатие клавиши Enter.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Я_*
сообщение 27.9.2010, 8:16
Сообщение #4





Гости








    


Собственно другой вопрос нарисовался.
как правильно передать пароль. Такое ощущение, что пароль не передается вообще.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
alex977
  опции профиля:
сообщение 27.9.2010, 14:25
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 310
Регистрация: 19.6.2008
Из: Россия, МО, г.Мытищи
Пользователь №: 206

Спасибо сказали: 77 раз(а)




Репутация:   8  


Похожая тема (если кратко - устройство не успевает обрабатывать команды)

Сообщение отредактировал alex977 - 27.9.2010, 14:39
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Я_*
сообщение 27.9.2010, 15:07
Сообщение #6





Гости








    


Проблему я решил. Устройство все успевает, только надо выпрямители рук подарить докописцам и людям, которые копипастят. Не знаешь что пишешь - не пиши. В общем объясняю.
В примерах, ввод команды заканчивается "\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


Вот так.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.11.2024, 0:45