Za pomocą polecenia telnet docs.python.org 80
mogę 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 HEAD
zamiast GET
, otrzymasz taką samą odpowiedź, jak w przypadku GET
żądania, z wyjątkiem treści wiadomości.
Tak więc użyj, HEAD
jeśli chcesz tylko sprawdzić nagłówki HTTP. (tzn. aby treść odpowiedzi nie zaśmiecała danych wyjściowych powłoki).
GET
opublikowanego przez ciebie408 Request Time-out
komunikatu pojawia się błąd. Ponadtowget http://docs.python.org/2/license.html
nie ma opcji?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.telnet docs.python.org 80
<ENTER>
GET /2/license.html HTTP/1.1
<ENTER>
Host: docs.python.org
<ENTER>
<ENTER>
<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 HTTPtelnet < request.txt
ale nie mogę uruchomićGET
polecenia.Odpowiedzi:
Użyj netcat (polecenie nc) zamiast „telnet”, więc
Telnet to szybki i łatwy hack, ale netcat jest najwyraźniej właściwym narzędziem do tego zadania.
źródło
Tak naprawdę nie mam doświadczenia,
telnet
ale wymaga to przekierowania pliku:Mogę uzyskać prawidłowe połączenie z serwerem w następujący sposób:
Być może uda ci się wymyślić, jak uzyskać akceptację
GET
polecenia, ale nie mogłem. Alternatywą jest użycieexpect
skryptu:Następnie możesz zapisać skrypt jako
telnet.exp
, wykonać go i uruchomić:źródło
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.nc
jest lepszym rozwiązaniem, powinieneś je zaakceptować.interact
sposób można zakończyć tenexpect
skrypt.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 zman expect
). Tak,interact
jest sposób, aby dać użytkownikowi sposób faktycznie przy użyciu połączenia Telnet.telnet
a nie interakcji z nim, myślę, że powinieneś skończyć zclose -i $spawn_id
czymś takim. Następnie skrypt zakończy działanie. Zinteract
tak naprawdę nie byłem w stanie wyjśćtelnet
i musiałem zamknąć terminal. Całkiem nieszczęśliwy (choć może to być częściowo moja wina).