2009-03-13 9 views
14

Sto cercando di giocare con netcat per saperne di più su come funziona HTTP. Mi piacerebbe scriverne un po 'in bash o in Perl, ma all'inizio ho sperimentato un ostacolo nei miei test.Script di una richiesta di intestazione HTTP con netcat

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

Questo funziona:

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

Ma quando ho messo le stesse informazioni in un file di testo e dei mangimi a netcat attraverso un tubo o tramite redirezione, in preparazione per lo scripting, non restituisce le intestazioni.
Il file di testo consiste nella richiesta HEAD e due ritorni a capo:

HEAD/HTTP/1.0 

Invio le stesse informazioni via eco o printf non funziona neanche.

$ 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 male? Non sono sicuro che si tratti di un problema di bash, un problema di eco o un problema di netcat.

Ho controllato il traffico tramite Wireshark e la richiesta riuscita (digitata manualmente) invia il newline finale in un secondo pacchetto, mentre i metodi echo, printf e text mantengono la newline nello stesso pacchetto, ma io sono non sono sicuro di cosa provoca questo comportamento.

+0

Cordiali saluti, il \ r \ n nel printf è intenzionale; Sono passato tra \ r e \ n in varie combinazioni per vedere se ha cambiato qualcosa - senza alcun effetto. – romandas

risposta

22

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 simili dovrebbero funzionare.

+0

Questo non funziona per me. Ho copiato la tua linea direttamente, ma la connessione termina ancora prima di trasmettere l'intestazione. – romandas

+0

Quindi il problema è al tuo server. printf "HEAD/HTTP/1.0 \ r \ n \ r \ n" | nc www.toothycat.net 80 lavora qui. – moonshadow

+0

Il server non sta terminando la richiesta; è avviato dal cliente Wireshark mostra al mio cliente l'invio di un pacchetto FIN subito dopo il pacchetto di richiesta HEAD, quindi l'ACK del server e termina con grazia. Non sei sicuro di cosa causi la differenza. Quale versione di netcat stai usando? – romandas

7

Un altro modo è utilizzare la convenzione denominata "heredoc".

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

Funziona meglio che mai – dotslash

2

Un altro modo per ottenere nc per attendere la risposta consiste nell'aggiungere una sospensione all'ingresso. per esempio.

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

È possibile utilizzare sotto il comando netcat per rendere il vostro server web esempio:

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 che viene utilizzato per il gateway predefinito (non importa quale interfaccia; Linux): 'ip route show | grep -o 'src [\ .0-9] \ +' | uniq | cut -d '' -f2' –

0

Questa linea funziona anche come equivalenti:

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