telnetlib — Telnet клиент


Модуль telnetlib предоставляет класс Telnet, реализующий протокол Telnet. См. RFC 854 для получения подробной информации о протоколе. Кроме того, он предоставляет символические константы для символов протокола (см. ниже) и для telnet параметров. Символические имена опций telnet следуют определениям в arpa/telnet.h, с удаленным начальным TELOPT_. Символические имена опций, которые традиционно не включаются в arpa/telnet.h, смотрите в исходнике модуля.

Символические константы для telnet команд: IAC, DONT, DO, WONT, WILL, SE (конец субсогласования), NOP (нет операции), DM (метка данных), BRK (разрыв), IP (процесс прерывания), AO ( Прервать вывод), AYT (Вы там), EC (Стереть символ), EL (Стереть строку), GA (Вперед), SB (Начало дополнительного согласования).

class telnetlib.Telnet(host=None, port=0[, timeout])

Telnet представляет подключение к Telnet серверу. Экземпляр изначально не подключён по умолчанию; для установления соединения необходимо использовать метод open(). В качестве альтернативы имя хоста и необязательный номер порта также могут быть переданы конструктору, и в этом случае соединение с сервером будет установлено до возврата конструктора. Необязательный параметр timeout указывает тайм-аут в секундах для блокировки операций, таких как попытка подключения (если он не указан, будет использоваться глобальная настройка тайм-аута по умолчанию).

Не открывайте повторно уже подключенный экземпляр.

У данного класса есть много read_*() методов. Обратите внимание, что некоторые из них вызывают EOFError при чтении конца соединения, потому что они могут возвращать пустую строку по другим причинам. См. отдельные описания ниже.

Объект Telnet является менеджером контекста и может использоваться в операторе with. Когда блок with заканчивается, вызывается метод close():

>>> from telnetlib import Telnet
>>> with Telnet('localhost', 23) as tn:
...     tn.interact()
...

Изменено в версии 3.6: Добавлена поддержка контекстного менеджера

См.также

RFC 854 — Спецификация протокола Telnet
Определение протокола Telnet.

Объекты Telnet

У экземпляров Telnet есть следующие методы:

Telnet.read_until(expected, timeout=None)

Читает до тех пор, пока не встретится заданная expected строка байтов или пока не пройдет timeout секунд.

Если совпадений не найдено, вместо этого возвращает все, что доступно, возможно, пустые байты. Вызывается EOFError, если соединение закрыто и готовые данные недоступны.

Telnet.read_all()

Читает все данные до EOF как байты; блокировать до закрытия соединения.

Telnet.read_some()

Читает хотя бы один байт подготовленных данных, если не будет достигнут EOF. Возвращает b'', если встретился EOF. Блокируется, если нет доступных данных.

Telnet.read_very_eager()

Читает все, что можно без блокировки ввода-вывода (жадно).

Вызывается EOFError, если соединение закрыто и готовые данные недоступны. Возвращает b'', если в противном случае нет готовых данных. Не блокируется, кроме как в середине IAC последовательности.

Telnet.read_eager()

Читает легкодоступные данные.

Вызывается EOFError, если соединение закрыто и готовые данные недоступны. Возвращает b'', если в противном случае нет готовых данных. Не блокируется, кроме как в середине IAC последовательности.

Telnet.read_lazy()

Обрабатывает и возвращает данные уже в очередях (лениво).

Вызывается EOFError, если соединение закрыто и данные недоступны. Возвращает b'', если в противном случае нет готовых данных. Не блокируется, кроме как в середине IAC последовательности.

Telnet.read_very_lazy()

Возвращает любые данные, доступные в приготовленной очереди (очень лениво).

Вызывается EOFError, если соединение закрыто и данные недоступны. Возвращает b'', если в противном случае нет готовых данных. Данный метод никогда не блокируется.

Telnet.read_sb_data()

Возвращает данные, собранные между парой SB/SE (начало/конец подопции). Обратный вызов должен получить доступ к этим данным, когда он был вызван с помощью команды SE. Данный метод никогда не блокируется.

Telnet.open(host, port=0[, timeout])

Подключается к хосту. Необязательный второй аргумент — это номер порта, который по умолчанию соответствует стандартному порту Telnet (23). Необязательный параметр timeout указывает тайм-аут в секундах для блокировки операций, таких как попытка подключения (если он не указан, будет использоваться глобальная настройка тайм-аута по умолчанию).

Не пытайтесь повторно открыть уже подключенный экземпляр.

Вызывает событие аудита telnetlib.Telnet.open с аргументами self, host, port.

Telnet.msg(msg, *args)

Выводит отладочное сообщение, когда уровень отладки равен > 0. Если присутствуют дополнительные аргументы, они заменяются в сообщении с помощью стандартного оператора форматирования строки.

Telnet.set_debuglevel(debuglevel)

Устанавливает уровень отладки. Чем выше значение debuglevel, тем больше результатов отладки вы получите (по sys.stdout).

Telnet.close()

Закрывает соединение.

Telnet.get_socket()

Возвращает объект сокета, используемый внутри.

Telnet.fileno()

Возвращает файловый дескриптор объекта сокета, используемого внутри.

Telnet.write(buffer)

Записывает строку байтов в сокет, удваивая любые IAC символы. Может заблокироваться, если соединение заблокировано. Может вызвать OSError, если соединение закрыто.

Вызывает событие аудита telnetlib.Telnet.write с аргументами self, buffer.

Изменено в версии 3.3: Данный метод использовался для создания socket.error, который теперь является псевдонимом OSError.

Telnet.interact()

Функция взаимодействия, эмулирующая очень тупого Telnet клиента.

Telnet.mt_interact()

Многопоточная версия interact().

Telnet.expect(list, timeout=None)

Читает до тех пор, пока одно из списка регулярных выражений не совпадет.

Первый аргумент — это список регулярных выражений, скомпилированных (regex объектов) или нескомпилированных (байтовые строки). Необязательный второй аргумент — это время ожидания в секундах; по умолчанию блокируется на неопределенный срок.

Возвращает кортеж из трех элементов: индекс в списке первого совпадающего регулярного выражения; возвращённый объект совпадения; и байты считываются до совпадения включительно.

Если найден конец файла и ни один байт не прочитан, вызывается EOFError. В противном случае, когда ничего не совпадает, возвращает (-1, None, data), где data — это количество байтов, полученных на данный момент (могут быть пустыми байтами, если произошел тайм-аут).

Если регулярное выражение заканчивается жадным совпадением (например, .*) или если несколько выражений могут соответствовать одному и тому же вводу, результаты недетерминированы и могут зависеть от времени ввода-вывода.

Telnet.set_option_negotiation_callback(callback)

Каждый раз, когда во входном потоке считывается telnet параметр, данный callback (если установлен) вызывается со следующими параметрами: callback(сокет telnet, команда (DO/DONT/WILL/WONT), option). После этого telnetlib не выполняет никаких действий.

Пример telnet клиента

Простой пример, иллюстрирующий типичное использование:

import getpass
import telnetlib

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

tn = telnetlib.Telnet(HOST)

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

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

print(tn.read_all().decode('ascii'))