2009-03-13 18 views
14

Estoy tratando de jugar con netcat para obtener más información sobre cómo funciona HTTP. Me gustaría escribir un guión para Bash o Perl, pero me he topado con un obstáculo al principio de mis pruebas.Creación de scripts de una solicitud de encabezado HTTP con netcat

Si ejecuto netcat directamente desde el indicador y escribo una solicitud HEAD, funciona y recibo los encabezados del servidor web que estoy sondeando.

Esto funciona:

 [[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] ~]$

Pero cuando pongo la misma información en un archivo de texto y lo alimentan a través de una tubería netcat o por medio de redirección, en la preparación de secuencias de comandos, no devuelve las cabeceras.
El archivo de texto consiste en la petición HEAD y dos nuevas líneas:

HEAD/HTTP/1.0 

El envío de la misma información a través de eco o printf no funciona bien.

$ 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

¿Alguna idea de lo que estoy haciendo mal? No estoy seguro de si es un problema de bash, un problema de eco o un problema de netcat.

Revisé el tráfico a través de Wireshark, y la solicitud exitosa (ingresada manualmente) envía la nueva línea final en un segundo paquete, mientras que los métodos de eco, printf y archivo de texto mantienen la nueva línea en el mismo paquete, pero estoy no estoy seguro de qué causa este comportamiento.

+0

FYI, el \ r \ n en el printf tiene un propósito; Cambié entre \ ry \ n en varias combinaciones para ver si cambió algo, sin ningún efecto. – romandas

Respuesta

22

Necesita dos lotes de "\ r \ n", y también para decirle a netcat que espere una respuesta. printf "HEAD/HTTP/1.0\r\n\r\n" |nc -n -i 1 10.1.1.2 80 o similar debería funcionar.

+0

Esto no funciona para mí. Copié tu línea directamente, pero la conexión aún termina antes de transmitir el encabezado. – romandas

+0

Entonces el problema está en su servidor final. printf "HEAD/HTTP/1.0 \ r \ n \ r \ n" | nc www.toothycat.net 80 funciona aquí. – moonshadow

+0

El servidor no está cancelando la solicitud; es iniciado por el cliente. Wireshark muestra que mi cliente envía un paquete FIN justo después del paquete de solicitud HEAD, luego el servidor ACK y finaliza con gracia. No estoy seguro de qué causa la diferencia. ¿Qué versión de netcat estás usando? – romandas

7

Otra forma es usar lo que se llama la convención 'heredoc'.

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

Esto funciona mejor que nunca – dotslash

2

Otra forma de obtener nc para esperar la respuesta es agregar un descanso a la entrada. p.ej.

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

Puede utilizar a continuación comando netcat para que su servidor web ejemplo:

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 que se utiliza para la puerta de enlace predeterminada (no importa qué interfaz; Linux): 'ip route show | grep -o 'src [\ .0-9] \ +' | uniq | corte -d '' -f2' –

0

Esta línea también trabajará como equivalentes:

echo -e "HEAD/HTTP/1.1\nHost: 10.1.1.2\nConnection: close\n\n\n\n" | netcat 10.1.1.2 80 
Cuestiones relacionadas