2009-03-13 8 views
14

J'essaie de jouer avec netcat pour en savoir plus sur le fonctionnement de HTTP. Je voudrais en écrire quelques-unes dans bash ou Perl, mais je suis tombé sur une pierre d'achoppement au début de mes tests.Scripter une requête d'en-tête HTTP avec netcat

Si j'exécute netcat directement à partir de l'invite et que je tape une requête HEAD, cela fonctionne et je reçois les en-têtes pour le serveur web que je vérifie.

Cela fonctionne:

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

Mais quand je mets les mêmes informations dans un fichier texte et pais à netcat par un tuyau ou via une redirection, en préparation pour les scripts, il ne retourne pas les en-têtes.
Le fichier texte se compose de la demande de tête et deux nouvelles lignes:

HEAD/HTTP/1.0 

Envoi de la même information par l'intermédiaire écho 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 de ce que je fais mal? Vous ne savez pas si c'est un problème de bash, un problème d'écho ou un problème netcat. J'ai vérifié le trafic via Wireshark, et la requête réussie (tapée manuellement) envoie le retour à la ligne dans un deuxième paquet, alors que les méthodes de fichier echo, printf et text maintiennent le retour à la ligne dans le même paquet, mais je suis pas sûr de ce qui cause ce comportement.

+0

Pour votre information, le \ r \ n dans le printf est utile; J'ai basculé entre \ r et \ n dans diverses combinaisons pour voir si cela a changé quelque chose - sans effet. – romandas

Répondre

22

Vous avez besoin de deux lots de "\ r \ n", et aussi 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.

+0

Cela ne fonctionne pas pour moi. J'ai copié votre ligne directement, mais la connexion se termine toujours avant de transmettre l'en-tête. – romandas

+0

Ensuite, le problème est à la fin de votre serveur. printf "HEAD/HTTP/1.0 \ r \ n \ r \ n" | nc www.toothycat.net 80 fonctionne ici. – moonshadow

+0

Le serveur ne termine pas la demande; c'est initié par le client. Wireshark montre à mon client l'envoi d'un paquet FIN juste après le paquet de requête HEAD, puis l'ACK du serveur et se termine gracieusement. Je ne sais pas ce qui cause la différence. Quelle version de netcat utilisez-vous? – romandas

7

Une autre manière est d'utiliser ce qu'on appelle la convention 'heredoc'.

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

Cela fonctionne mieux que jamais – dotslash

2

Une autre façon d'attendre la réponse de nc est d'ajouter un sommeil à l'entrée. par exemple.

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

Vous pouvez utiliser ci-dessous commande netcat pour faire de votre serveur Web par exemple:

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 qui est utilisée pour la passerelle par défaut (quelle que soit l'interface; Linux): 'ip route show | grep -o 'src [\ .0-9] \ +' | uniq | couper -d '' -f2' –

0

Cette ligne travaillera é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 
Questions connexes