Domanda

Sto cercando di giocare con netcat per saperne di più su come funziona HTTP. Mi piacerebbe scriverne un po 'in Bash o Perl, ma ho già incontrato un ostacolo all'inizio del mio test.

Se eseguo netcat direttamente dal prompt e digito una richiesta HEAD, funziona e ricevo le intestazioni per il web server che sto sondando.

Funziona:

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

Ma quando inserisco le stesse informazioni in un file di testo e le invio a netcat tramite una pipe o tramite il reindirizzamento, in preparazione allo scripting, non restituisce le intestazioni.
Il file di testo è costituito dalla richiesta HEAD e da due nuove righe:

HEAD / HTTP/1.0

Anche l'invio delle stesse informazioni tramite echo o printf non funziona.

$ 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

Qualche idea su cosa sto facendo di sbagliato? Non sono sicuro se si tratta di un problema bash, un problema di eco o un problema di netcat.

Ho controllato il traffico tramite Wireshark e la richiesta riuscita (digitata manualmente) invia la riga finale trascinata in un secondo pacchetto, mentre i metodi echo, printf e file di testo mantengono la riga nuova nello stesso pacchetto, ma non lo sono sicuro cosa causa questo comportamento.

È stato utile?

Soluzione

Sono necessari due lotti di " \ r \ n " ;, e anche per dire a netcat di attendere una risposta. printf " HEAD / HTTP / 1.0 \ r \ n \ r \ n " | nc -n -i 1 10.1.1.2 80 o simile dovrebbe funzionare.

Altri suggerimenti

Un altro modo è quello di usare quella che viene chiamata la convenzione "ereditaria".

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

Un altro modo per far sì che nc attenda la risposta è aggiungere uno sleep all'input. per es.

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

Puoi usare il comando netcat sotto per rendere il tuo server web di istanza:

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&

Questa riga funzionerà anche come equivalente:

echo -e "HEAD / HTTP/1.1\nHost: 10.1.1.2\nConnection: close\n\n\n\n" | netcat 10.1.1.2 80
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top