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.

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top