Pregunta

Estoy tratando de jugar con netcat para aprender más sobre cómo funciona HTTP. Me gustaría escribir algunos de ellos en bash o Perl, pero me topé con un obstáculo al principio de mis pruebas.

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

Esto funciona:

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

    [romandas@localhost ~]$

Pero cuando pongo la misma información en un archivo de texto y lo alimento a netcat a través de una tubería o mediante redirección, en preparación para la secuencia de comandos, no devuelve los encabezados.
El archivo de texto consta de la solicitud HEAD y dos líneas nuevas:

HEAD / HTTP/1.0

Enviar la misma información a través de echo o printf tampoco funciona.

$ 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 bash, un problema de eco o un problema de netcat.

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

¿Fue útil?

Solución

Necesita dos lotes de " \ r \ n " ;, y también 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.

Otros consejos

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

Otra forma de hacer que nc espere la respuesta es agregar una suspensión a la entrada. por ejemplo,

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

Puede usar el siguiente comando netcat para hacer su servidor web de instancia:

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&

Esta línea también funcionará como equivalente:

echo -e "HEAD / HTTP/1.1\nHost: 10.1.1.2\nConnection: close\n\n\n\n" | netcat 10.1.1.2 80
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top