web-dev-qa-db-fra.com

Script d'une requête d'en-tête HTTP avec netcat

J'essaie de jouer avec netcat pour en savoir plus sur le fonctionnement de HTTP. J'aimerais bien en scripter une partie en bash ou en Perl, mais je me suis heurté à une pierre d'achoppement au début de mes tests.

Si je lance netcat directement à partir de l'invite et que je tape une demande HEAD, cela fonctionne et je reçois les en-têtes du serveur Web que je teste.

Cela marche: 

     [romandas @ localhost ~] $ nc 10.1.1.2 80 
 HEAD/HTTP/1.0 
 
 HTTP/1.1 200 OK 
 MIME- Version: 1.0 
 Serveur: Édité vers 
 Longueur du contenu: 0 
 Cache-Control: public 
 Expire le: samedi 01 janvier 2050 18:00:00 GMT 
 
 [romandas @ localhost ~] $

Mais lorsque je mets les mêmes informations dans un fichier texte et que je les transmets à netcat via un canal ou une redirection, en préparation du script, elles ne renvoient pas les en-têtes.
Le fichier texte comprend la demande HEAD et deux nouvelles lignes: 

HEAD/HTTP/1.0 
 

Envoyer les mêmes informations via echo ou printf ne fonctionne pas non plus.

$ 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

Des idées que je fais mal? Je ne sais pas s'il s'agit d'un problème bash, d'écho ou netcat. 

J'ai vérifié le trafic via Wireshark, et la requête réussie (saisie manuellement) envoie la nouvelle ligne de fuite dans un second paquet, alors que les méthodes echo, printf et fichier texte conservent la nouvelle ligne dans le même paquet, mais je ne suis pas sûr de la cause. Ce comportement.

17
romandas

Vous avez besoin de deux "\ r\n", et de dire à netcat d’attendre une réponse. printf "HEAD / HTTP/1.0\r\n\r\n" |nc -n -i 1 10.1.1.2 80 ou similaire devrait fonctionner.

24
moonshadow

Une autre méthode consiste à utiliser ce que l'on appelle la convention «heredoc».

$ nc -n -i 1 10.1.1.2 80 <<EOF
> HEAD / HTTP/1.0
>
> EOF
7
Bruce S

Un autre moyen d'attendre que la réponse soit attendue consiste à ajouter un sommeil à l'entrée. par exemple.

(printf 'GET / HTTP/1.0\r\n\r\n'; sleep 1) | nc Host 80
2
Jay Soffian

Vous pouvez utiliser la commande ci-dessous netcat pour créer votre serveur Web d'instance:

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
Prashant Shetty

Cette ligne fonctionnera également comme équivalent:

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