Завершение сеанса Python telnetlib

Если я использую Python telnetlib, есть ли способ закрыть сеанс telnet, если это устройство ничего не поддерживает для завершения сеанса telnet, поэтому не используйте Ctrl + что-то или выход или что-то в этом роде.

Мне нужно это, чтобы я мог использовать read.all


person Dominik    schedule 01.03.2016    source источник
comment
У меня нет под рукой telnet-сервера, чтобы проверить, но попробуйте позвонить .close() перед чтением.   -  person tdelaney    schedule 01.03.2016
comment
...а может и нет. Глядя на источник, это не сработает. После import socket и предположим, что ваш сеанс называется session, попробуйте session.get_socket().shutdown(socket.SHUT_WR). Это должно убедить другую сторону разорвать свою сторону соединения.   -  person tdelaney    schedule 01.03.2016
comment
Пробовал, но получил вот это:   -  person Dominik    schedule 02.03.2016
comment
tn.get_socket().shutdown(socket.SHUT_WR) NameError: имя «сокет» не определено tn — это имя сеанса, но что такое сокет?   -  person Dominik    schedule 02.03.2016
comment
Это имя модуля сокета. Импортируйте его, как показано перед вызовом.   -  person tdelaney    schedule 02.03.2016
comment
Аааа, идиот, это работает, спасибо, к сожалению, я не могу поставить вам галочку за успешное решение, потому что это комментарий, можете ли вы сформулировать его как ответ?   -  person Dominik    schedule 02.03.2016


Ответы (1)


Сетевые сокеты позволяют отключить каналы записи и/или чтения, чтобы другая сторона знала, что вы завершили эту часть разговора. Для telnet-сервера отключение канала записи является выходом. Он должен завершить отправку всего, что находится в конвейере отправки, а затем полностью закрыть соединение. Это закрытие является EOF, и read_all должен вернуться. Итак, если у вас уже есть соединение с именем tn

tn.get_socket().shutdown(socket.SHUT_WR)
data = tn.read_all()
tn.close()
person tdelaney    schedule 02.03.2016