Scripting di una richiesta di intestazione HTTP con netcat
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.
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