Подання вмісту текстового файлу як команда 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. (тобто щоб вміст відповіді не захаращував ваш вихід оболонки.)


Чи можете ви включити фактичну команду, яку ви виконуєте вручну, щоб ми могли порівняти? Коли я запускаю повідомлення, яке GETви опублікували, я отримую 408 Request Time-outпомилку. Також wget http://docs.python.org/2/license.htmlне є варіантом?
тердон

Команди правильні. Я думаю, що ви здійснюєте зв’язок із сервером в момент введення telnet docs.python.org 80, тому вам доведеться поспішити і ввести ці два рядки (скопіювати пасту, якщо не буде) протягом декількох секунд, або сервер поверне помилку очікування.
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команду працювати.
тердон

Відповіді:


21

Використовуйте netcat (команда nc), а не "telnet", так

котячий запит.txt | nc docs.python.org 80

Telnet - це швидкий і простий злом, але netcat, мабуть, є правильним інструментом для роботи.


Як Telnet "швидше" і "простіше", ніж netcap? Я не бачу різниці у використанні в цьому відношенні для цього випадку.
Bentley4

Звичайно, не для цього випадку, але я думаю, що люди (читайте Мене, і, мабуть, ви !!!), як правило, використовують telnet, оскільки це перше, що ми дізналися, і, звичайно, його доступне в Windows та Linux, де я вважаю, netcat не поставляється попередньо встановлено під Windows.
davidgo

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

Класно, я не знав expect! Я вибрав відповідь давидго, тому що це просто найкраще рішення для цієї справи. Я не бачу різниці у використанні між netcap і telnet, чого я хотів досягти. Дякую за зусилля, тим не менше, Тердоне, якби я міг більше підтримати вашу відповідь, я би хотів.
Bentley4

1
@ Bentley4 не має жодних проблем, використовуючи ncце краще рішення, ви повинні прийняти це.
тердон

Я не бачу, як interactправильно закінчити цей expectсценарій.
2rs2ts

@ 2rs2ts Я дуже мало знаю про очікування, ви можете мати рацію, але я не можу сказати, оскільки ваш коментар не сказав мені, чому ви вважаєте, що це неправильно. Я розумію, що interact"дає управління поточним процесом користувачеві, так що натискання клавіш надсилаються до поточного процесу, а stdout і stderr поточного процесу повертаються" (це від man expect). Отже, interactце спосіб надати користувачеві спосіб фактичного використання підключення telnet.
terdon

Оскільки оригінальне запитання стосувалося введення вмісту файлу, telnetа не взаємодії з ним, я думаю, ви повинні закінчити close -i $spawn_idчи щось подібне. Тоді сценарій вийде. Із interactнасправді я взагалі не міг вийти telnet, і довелося закрити свій термінал. Досить жалюгідний (хоча це, можливо, частково я і винен.)
2rs2ts
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.