Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Python и telnetlib

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

a1dot0

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте! Подскажите кто-нибудь, как сделать довольно простую вещь в Python, а именно подключение к железке по telnet, передача команд, считывание результата и в зависимости от него ввод новых команд и опять считывание результата (и так много раз). Вот с подключением и вводом команд всё просто, а вот со считываением напряг. Если бы надо было просто подключиться ввести команды, а потом просто посмотреть результат и отключиться, то подходит read_all(). Но вот со считыванием без отключения у меня напряг. Если использовать read_some(), то всё прекрасно считывается, но до тех пор пока в сокете есть данные, если их нет, то происходит блокировка (как, в принципе и написано - "Block if no data is immediately available"), а это фактически зависание скрипта, т.к. никаких данных не поступает, а функция их ждет. Есть еще функция read_eager(), которая не блокируется, но как она работает, я так и не понял

Всего записей: 86 | Зарегистр. 20-09-2006 | Отправлено: 14:56 06-05-2009
afiget



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Судя по указанным функциям, речь может идти о telnetlib.
Используйте read_until. Вторым параметров у нее как раз таймаут.
 
А вообще нужно приводить свой код, чтобы было понятно что отвечать.

Всего записей: 545 | Зарегистр. 31-12-2005 | Отправлено: 19:02 06-05-2009
a1dot0

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
read_until() тут не подойдет.
 
Допустим, код такой:
 

Код:
import getpass
import sys
import telnetlib
import string
     
HOST = "172.17.4.1"
tn = telnetlib.Telnet(HOST)
tn.read_until("login")
tn.write("admin\n")
tn.read_until("Password: ")
tn.write("admin\n")
tn.write("cd /\n")
tn.write("ls -1\n")
 
#Вот тут надо получить результат команды ls и в зависимости, например, от наличия некоторых директорий или файлов, что то сделать.
 
tn.write("exit\n")
 

 
Вот в месте где коментарий, функция read_until() подошла бы, если надо было просто проверить наличие одной директории. Если использовать read_some(), то всё нормально, но когда список файлов и директории заканчивается, то она блокируется и всё "виснет". Как то так.

Всего записей: 86 | Зарегистр. 20-09-2006 | Отправлено: 19:24 06-05-2009
afiget



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Используйте 3 параметр конструктора Telnet - там можно установить тайм аут для блокирующих операций.
В приведенном коде не вижу цикла обработки полученной информации. Код линейный. Ну и таймауты на ответ от удаленного хоста не мешало бы предусмотреть.
Кстати, этот код под Win работать не будет. Я не про команду ls, я про предупреждение о передаче пароля на другой хост, которое появляется первым и ожидает ввода "y" или "n".

Всего записей: 545 | Зарегистр. 31-12-2005 | Отправлено: 23:37 06-05-2009
a1dot0

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Хм, действительно, как я не заметил, что есть еще параметры у Telnet. Тогда последний вопрос, как отловить этот timed out? Т.е. вставлю я вместо коммента цикл типа:
 

Код:
 
while ???:
   data=data+tn.read_some()
 

 
вот какое условие вписать? Не бейте сильно, Python изучаю не так давно.

Всего записей: 86 | Зарегистр. 20-09-2006 | Отправлено: 23:59 06-05-2009
afiget



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
read_some после таймаута сам все сделает и передаст управление на следующую строку программы. А в data будет то, что накоплено.
Исходя из того, что read_some вернет пустую строку после получения всех данных, можно модифицировать код так:
 
while 1:
  piece = tn.read_some()
  if piece == ''
    break
  data = data + piece
 
Т.е. получаем данные до тех пор, пока не придет EOF.
 
Можно еще заложить сравнение порции с пустой строкой прямо в условие цикла. Как вам удобнее и привычнее.
 
Я не уверен, что после таймаута read_some() тоже вернет пустую строку. Это проверьте сами.

Всего записей: 545 | Зарегистр. 31-12-2005 | Отправлено: 00:37 07-05-2009
a1dot0

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Огромное спасибо!

Всего записей: 86 | Зарегистр. 20-09-2006 | Отправлено: 16:15 07-05-2009
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Python и telnetlib


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru