Question

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 sur lequel je travaille.

Ceci fonctionne:

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

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

HEAD / HTTP/1.0

L'envoi des 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 le caractère de fin de ligne dans un second paquet, alors que les méthodes echo, printf et text permettent de conserver la nouvelle ligne dans le même paquet, mais je ne le suis pas. bien sûr ce qui cause ce comportement.

Était-ce utile?

La solution

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

Autres conseils

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

Une autre façon d’attendre que la réponse soit attendue est d’ajouter un sommeil à l’entrée. par exemple

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

Vous pouvez utiliser la commande ci-dessous netcat pour rendre 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&

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top