Przesyłanie zawartości pliku tekstowego jako komendy do telnet

10

Za pomocą polecenia telnet docs.python.org 80mogę wykonać ręczne żądanie HTTP http://docs.python.org/2/license.html, wpisując rzeczywiste żądanie.

Teraz zamiast wpisywać go na żywo, chciałbym nakarmić żądanie z pliku tekstowego.

Próbowałem tego:

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


request.txt :

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

(Musisz zakończyć plik pustą linią, inaczej dostaniesz złe żądanie!)


Ale połączenie z serwerem jest natychmiast zamykane.

W jaki sposób należy prawidłowo rura request.txt do telnet docs.python.org 80?


edytować:

Dobrze wiedzieć; jeśli użyjesz HEADzamiast GET, otrzymasz taką samą odpowiedź, jak w przypadku GETżądania, z wyjątkiem treści wiadomości.
Tak więc użyj, HEADjeśli chcesz tylko sprawdzić nagłówki HTTP. (tzn. aby treść odpowiedzi nie zaśmiecała danych wyjściowych powłoki).

Bentley4
źródło
Czy możesz podać rzeczywiste polecenie uruchamiane ręcznie, abyśmy mogli porównać? Po uruchomieniu GETopublikowanego przez ciebie 408 Request Time-outkomunikatu pojawia się błąd. Ponadto wget http://docs.python.org/2/license.htmlnie ma opcji?
terdon
Polecenia są poprawne. Myślę, że nawiązujesz połączenie z serwerem w chwili wejścia telnet docs.python.org 80, więc będziesz musiał się spieszyć i wpisać te dwie linie (skopiuj wklej, jeśli jest to konieczne) w ciągu kilku sekund, inaczej serwer zwróci błąd przekroczenia limitu czasu.
Bentley4
Oto dokładne polecenia:telnet docs.python.org 80 <ENTER> GET /2/license.html HTTP/1.1 <ENTER> Host: docs.python.org <ENTER> <ENTER>
Bentley4,
1
Myślę, że powodem, dla którego musisz wpisać <ENTER>po raz drugi na końcu, jest to, że protokół HTTP wymaga dodatkowej pustej linii po nagłówkach żądania. Zobacz sekcję dotyczącą wiadomości żądania w artykule wiki HTTP
Bentley4,
1
Cholera, teoretycznie powinieneś być w stanie to zrobić, telnet < request.txtale nie mogę uruchomić GETpolecenia.
terdon

Odpowiedzi:

21

Użyj netcat (polecenie nc) zamiast „telnet”, więc

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

Telnet to szybki i łatwy hack, ale netcat jest najwyraźniej właściwym narzędziem do tego zadania.

Davidgo
źródło
W jaki sposób Telnet jest „szybszy” i „łatwiejszy” niż netcap? W tej sprawie nie widzę żadnej różnicy w użytkowaniu.
Bentley4,
Z pewnością nie w tym przypadku, ale myślę, że ludzie (czytają Mnie i najwyraźniej ty !!!) mają tendencję do korzystania z telnet, ponieważ jest to pierwsza rzecz, której się nauczyliśmy, i oczywiście jest dostępna w systemach Windows i Linux, gdzie uważam, że netcat nie jest wstępnie zainstalowany w systemie Windows.
davidgo
5

Tak naprawdę nie mam doświadczenia, telnetale wymaga to przekierowania pliku:

telnet < abc.txt

Mogę uzyskać prawidłowe połączenie z serwerem w następujący sposób:

$ 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.

Być może uda ci się wymyślić, jak uzyskać akceptację GETpolecenia, ale nie mogłem. Alternatywą jest użycie expectskryptu:

#!/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

Następnie możesz zapisać skrypt jako telnet.exp, wykonać go i uruchomić:

./telnet.exp > output.html
terdon
źródło
Fajnie, nie wiedziałem expect! Wybrałem odpowiedź Davidgo, ponieważ jest to najlepsze rozwiązanie dla tej sprawy. Nie widzę żadnej różnicy w użyciu między netcap a telnet, co chciałem osiągnąć. Dzięki za wysiłek, mimo wszystko, Terdon, gdybym mógł jeszcze bardziej głosować twoją odpowiedź, zrobiłbym to.
Bentley4,
1
@ Bentley4 nie ma problemu, używanie ncjest lepszym rozwiązaniem, powinieneś je zaakceptować.
terdon
Nie rozumiem, w jaki interactsposób można zakończyć ten expectskrypt.
2rs2ts,
@ 2rs2ts Wiem bardzo mało o oczekiwaniu, możesz mieć rację, ale nie mogę powiedzieć, ponieważ twój komentarz nie powiedział mi, dlaczego uważasz, że to źle. Rozumiem, że interact„daje użytkownikowi kontrolę nad bieżącym procesem, dzięki czemu naciśnięcia klawiszy są wysyłane do bieżącego procesu, a standardowe wyjście i stderr bieżącego procesu są zwracane” (to jest z man expect). Tak, interactjest sposób, aby dać użytkownikowi sposób faktycznie przy użyciu połączenia Telnet.
terdon
Ponieważ pierwotne pytanie dotyczyło umieszczenia zawartości pliku, telneta nie interakcji z nim, myślę, że powinieneś skończyć z close -i $spawn_idczymś takim. Następnie skrypt zakończy działanie. Z interacttak naprawdę nie byłem w stanie wyjść telneti musiałem zamknąć terminal. Całkiem nieszczęśliwy (choć może to być częściowo moja wina).
2rs2ts