2016-09-15 13 views
0

Многие ресурсы, в том числе пример в официальной документации по адресу telnetlib, предполагают, что в конце перед выполнением read_all() вам нужно написать exit после команда как:Зачем нужен exit() или exec после telnetlib read_all()

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

Может кто-то, пожалуйста, помогите мне понять, зачем это нужно?

Если я попытаюсь сделать это без выхода, соединение telnet зависает (или, по крайней мере, похоже, что оно зависает), поскольку вывод выполняемой команды не отображается на терминале.

Кроме того, еще один способ заставить его работать, как я нашел в некоторых ресурсах, - это использовать «exec», чтобы запустить команду, а затем вам больше не нужна функция выхода.

Пожалуйста, помогите мне понять это.

ответ

0

read_all() считывает весь вывод до EOF. Другими словами, он ждет, пока удаленный сервер не закроет соединение и не вернет вам все данные, которые он отправил. Если вы еще не уведомили сервер с командой «exit», что у вас больше нет команд, он будет ждать их. И происходит тупик: вы держите открытое соединение, потому что ожидаете, что сервер скажет вам, что он отправил все, что он хотел сказать, и сервер ждет новых заказов от вас и готов добавить к нему больше данных.