Scripting um pedido de cabeçalho HTTP com netcat
Pergunta
Eu estou tentando brincar com netcat para saber mais sobre como funciona o HTTP. Eu gostaria de roteiro um pouco dele em bash ou Perl, mas eu bater em cima de uma pedra de tropeço no início de meu teste.
Se eu executar netcat reta desde o prompt e digite um pedido HEAD, ele funciona e eu receber os cabeçalhos para o servidor web que estou sondando.
Isso funciona:
[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 ~]$
Mas quando eu colocar a mesma informação em um arquivo de texto e alimentá-lo para netcat através de um tubo ou através de redirecionamento, em preparação para o script, ele não retorna os cabeçalhos.
O arquivo de texto consiste no pedido HEAD e duas novas linhas:
HEAD / HTTP/1.0
enviando a mesma informação via echo ou printf não quer trabalhar.
$ 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
Todas as idéias que eu estou fazendo errado? Não tenho certeza se é um problema festança, um problema de eco, ou um problema netcat.
Eu verifiquei o tráfego via Wireshark, e a solicitação de sucesso (digitado manualmente) envia a nova linha de fuga em um segundo pacote, enquanto o eco, métodos printf, e de arquivo de texto manter a nova linha no mesmo pacote, mas eu não sou certo o que causa esse comportamento.
Solução
Você precisa de dois lotes de "\ r \ n", e também para dizer netcat que esperar por uma resposta. printf "HEAD / HTTP/1.0\r\n\r\n" |nc -n -i 1 10.1.1.2 80
ou similar deve funcionar.
Outras dicas
Outra maneira é usar o que é chamado de 'heredoc' convenção.
$ nc -n -i 1 10.1.1.2 80 <<EOF
> HEAD / HTTP/1.0
>
> EOF
Outra maneira de obter nc para esperar a resposta é adicionar um sono à entrada. por exemplo.
(printf 'GET / HTTP/1.0\r\n\r\n'; sleep 1) | nc HOST 80
Você pode usar o comando abaixo netcat para tornar a sua instância servidor Web:
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&
Esta linha também funcionará como equivalente:
echo -e "HEAD / HTTP/1.1\nHost: 10.1.1.2\nConnection: close\n\n\n\n" | netcat 10.1.1.2 80