Scripting una solicitud de encabezado HTTP con netcat
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.
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