Подача содержимого текстового файла как команда в telnet

10

С помощью команды telnet docs.python.org 80я могу выполнить HTTP-запрос вручную http://docs.python.org/2/license.html, набрав фактический запрос.

Теперь, вместо того, чтобы вводить его вживую, я бы хотел отправить запрос из текстового файла.

Я попробовал это:

cat request.txt|telnet docs.python.org 80


request.txt :

GET /2/license.html HTTP/1.1 
Host: docs.python.org

(Вы должны заполнить файл пустой строкой, иначе получите неверный запрос!)


Но соединение с сервером закрывается сразу.

Как я должен правильно трубы request.txt к telnet docs.python.org 80?


редактировать:

Это хорошо знать; если вы используете HEADвместо GET, вы получите такой же ответ, как если бы вы сделали GETзапрос, за исключением тела сообщения.
Итак, используйте, HEADесли вы просто хотите изучить заголовки HTTP. (то есть, чтобы содержимое ответа не загромождало вывод вашей оболочки.)

Bentley4
источник
Не могли бы вы включить фактическую команду, которую вы запускаете вручную, чтобы мы могли сравнить? Когда я запускаю GETвы опубликовали, я получаю сообщение 408 Request Time-outоб ошибке. Кроме того, это wget http://docs.python.org/2/license.htmlне вариант?
Terdon
Команды верны. Я думаю, что вы устанавливаете соединение с сервером в тот момент, когда вы входите telnet docs.python.org 80, поэтому вам придется поторопиться и набрать эти две строки (copy paste, если necc.) В течение нескольких секунд, иначе сервер вернет ошибку тайм-аута.
Bentley4
Вот точные команды:telnet docs.python.org 80 <ENTER> GET /2/license.html HTTP/1.1 <ENTER> Host: docs.python.org <ENTER> <ENTER>
Bentley4
1
Я думаю, что причина, по которой вам нужно вводить <ENTER>второй раз в конце, заключается в том, что протокол HTTP требует дополнительной пустой строки после заголовков запроса. См. Раздел сообщения с запросом в статье о HTTP-вики
Bentley4
1
Черт возьми, теоретически, ты должен это сделать, telnet < request.txtно я не могу заставить GETкоманду работать.
Terdon

Ответы:

21

Используйте netcat (команда nc) вместо «telnet», поэтому

кошка request.txt | nc docs.python.org 80

Telnet - это быстрый и легкий взлом, но netcat, очевидно, является правильным инструментом для работы.

davidgo
источник
Как Telnet «быстрее» и «проще», чем netcap? Я не вижу никакой разницы в использовании в этом отношении для этого случая.
Bentley4
Конечно, не для этого случая, но я думаю, что люди (читайте Меня, и, видимо, вы !!!) склонны использовать telnet, потому что это первое, что мы узнали, и, конечно, это доступно в Windows и Linux, где я считаю netcat не поставляется предварительно установленным под Windows.
Давидго
5

У меня нет никакого опыта, telnetно он требует ввода перенаправления файлов:

telnet < abc.txt

Я могу заставить его правильно подключиться к серверу следующим образом:

$ cat abc.txt
open docs.python.org 80
$ telnet < abc.txt
telnet> Trying 82.94.164.162...
Connected to dinsdale.python.org.
Escape character is '^]'.
Connection closed by foreign host.

Возможно, вы можете понять, как заставить его принять GETкоманду, но я не смог. Альтернатива - использовать expectскрипт:

#!/usr/bin/expect

spawn telnet docs.python.org 80
expect "Escape character is '^]'." { 
     send "GET /2/license.html HTTP/1.1\nHost: docs.python.org\n\n" 
}
interact

Затем вы можете сохранить скрипт как telnet.exp, сделать его исполняемым и запустить его:

./telnet.exp > output.html
terdon
источник
Круто, я не знал о expect! Я выбрал ответ Давидго, потому что это лучшее решение для этого случая. Я не вижу никакой разницы в использовании между netcap и telnet для того, чего я хотел достичь. Тем не менее, спасибо за усилия, Тердон, если бы я мог больше выразить ваш ответ, я бы сделал это.
Bentley4
1
@ Bentley4 нет проблем, ncлучше использовать решение, вы должны принять его.
Terdon
Я не вижу, как interactправильно закончить этот expectсценарий.
2rs2ts
@ 2rs2ts Я очень мало знаю об ожидании, вы можете быть правы, но я не могу сказать, так как ваш комментарий не сказал мне, почему вы думаете, что это неправильно. Насколько я понимаю, interact«дает пользователю контроль над текущим процессом, чтобы нажатия клавиш отправлялись текущему процессу, а stdout и stderr текущего процесса возвращались» (это из man expect). Таким образом, interactэто способ дать пользователю способ фактически использовать соединение telnet.
Terdon
Так как первоначальный вопрос был о том, чтобы вводить содержимое файла, telnetа не взаимодействовать с ним, я думаю, вам следует покончить с close -i $spawn_idчем-то вроде этого. Тогда скрипт выйдет. С interactЯ был на самом деле не в состоянии выйти telnetна всех, и пришлось закрыть мой терминал. Довольно несчастен (хотя, возможно, это была частично моя вина.)
2rs2ts