2009-03-13 23 views
14

Próbuję grać z netcat, aby dowiedzieć się więcej o tym, jak działa HTTP. Chciałbym napisać trochę tego w bashu lub Perlu, ale trafiłem na przeszkodę na początku testów.Skryptowanie żądania nagłówka HTTP za pomocą netcata

Jeśli uruchomię Netcat prosto z monitu i wpisz żądanie HEAD, działa i otrzymuję nagłówki dla serwera WWW, który badam.

to działa:

 [[email protected] ~]$ nc 10.1.1.2 80 
    HEAD/HTTP/1.0 

    HTTP/1.1 200 OK 
    MIME-Version: 1.0 
    Server: Edited out 
    Content-length: 0 
    Cache-Control: public 
    Expires: Sat, 01 Jan 2050 18:00:00 GMT 

    [[email protected] ~]$

Ale kiedy kładę te same informacje w pliku tekstowym i karmić go netcata przez rurę lub poprzez przekierowanie, w ramach przygotowań do skryptów, to nie zwraca nagłówki.
Plik tekstowy składa wniosek głowę i dwóch nowych linii:

HEAD/HTTP/1.0 

Wysyłanie tych samych informacji poprzez echo lub printf nie działa albo.

$ printf "HEAD/HTTP/1.0\r\n"; |nc -n 10.1.1.2 80 
$ /bin/echo -ne 'HEAD/HTTP/1.0\n\n' |nc 10.1.1.2 80

Jakieś pomysły, co robię źle? Nie jestem pewien, czy jest to problem z bash, problem z echa, czy z netcat.

Sprawdziłem ruch przez Wireshark, a pomyślne żądanie (ręcznie wpisane) wysyła końcową nową linię w drugim pakiecie, podczas gdy metody echo, printf i tekstowe zachowują nową linię w tym samym pakiecie, ale jestem nie wiem, co powoduje takie zachowanie.

+0

FYI, z \ r \ n w printf jest celowe; Zmieniłem \ r \ nw różnych kombinacjach, aby zobaczyć, czy coś zmieniło - bez efektu. – romandas

Odpowiedz

22

Potrzebujesz dwóch partii "\ r \ n", a także nakazać netcatowi oczekiwanie na odpowiedź. printf "HEAD/HTTP/1.0\r\n\r\n" |nc -n -i 1 10.1.1.2 80 lub podobne powinny działać.

+0

To nie działa dla mnie. Skopiowałem twoją linię bezpośrednio, ale połączenie nadal kończy się przed wysłaniem nagłówka. – romandas

+0

Następnie problem występuje na końcu twojego serwera. printf "HEAD/HTTP/1.0 \ r \ n \ r \ n" | nc www.toothycat.net 80 działa tutaj. – moonshadow

+0

Serwer nie kończy żądania; jest inicjowany przez klienta. Wireshark pokazuje, że mój klient wysyła pakiet FIN zaraz po pakiecie żądania HEAD, a następnie ACK serwera i kończy się z wdziękiem. Nie wiem, co powoduje różnicę. Jakiej wersji netcat używasz? – romandas

7

Innym sposobem jest użycie tak zwanej konwencji "heredoc".

$ nc -n -i 1 10.1.1.2 80 <<EOF 
> HEAD/HTTP/1.0 
> 
> EOF 
+0

To działa lepiej niż kiedykolwiek. – dotslash

2

Innym sposobem, aby nc czekać na odpowiedź, jest dodanie uśpienia do wejścia. na przykład

(printf 'GET/HTTP/1.0\r\n\r\n'; sleep 1) | nc HOST 80 
0

Możesz skorzystać z poniższego polecenia netcat, aby Państwa instancji serwera WWW:

MYIP=$(ifconfig eth0|grep 'inet addr'|awk -F: '{print $2}'| awk '{print $1}') 
while true; do echo -e "HTTP/1.0 200 OK\r\n\r\nWelcome to $MYIP" | sudo nc -l -p 80 ; done& 
+0

IPv4 IP, który jest używany do bramy domyślnej (bez względu na interfejs, Linux): 'ip route show | grep -o 'src [\ .0-9] \ +' | uniq | cut -d '' -f2' –

0

Linia ta będzie również działać jako równoważne:

echo -e "HEAD/HTTP/1.1\nHost: 10.1.1.2\nConnection: close\n\n\n\n" | netcat 10.1.1.2 80 
Powiązane problemy