Não é possível canalizar o echo para o netcat?

2

Eu tenho o seguinte comando:

echo 'HTTP/1.1 200 OK\r\n' | nc -l -p 8000 -c

e quando eu curl localhost:8000 não estou vendo HTTP / 1.1 200 .. sendo impresso.

Estou no mac os x com o netcat 0.7.1

Alguma ideia?

#!/bin/bash

trap 'my_exit; exit' SIGINT SIGQUIT

my_exit()
{
        echo "you hit Ctrl-C/Ctrl-\, now exiting.."
        # cleanup commands here if any
}

if test $# -eq 0 ; then
        echo "Usage: $0 PORT"
        echo ""
        exit 1
fi

while true
do
        echo "HTTP/1.1 200 OK\r\n" | nc -l -p ${1} -c
done

e testando com:

curl localhost:8000

    
por Sparrowcide 21.08.2014 / 22:32

3 respostas

3

Sua abordagem tem vários problemas.

Sequências de escape

As seqüências de escape não são respeitadas, a menos que você use a opção -e .

echo -e 'HTTP/1.1 200 OK\r\n'

Sem -e , você está enviando as barras invertidas e as letras textualmente. O acima forma uma linha de status HTTP completa.

Protocolo

A linha de status sozinha não constitui uma resposta. O formato requer dois CRLFs

  1. Um como parte da própria Linha de Status
  2. Um para terminar o cabeçalho respnse

Tente isso

echo -e 'HTTP/1.1 200 OK\r\n\r\n'

invocação de netcat

A -c flag está completamente errada, porque espera um argumento de comando.

echo -e 'HTTP/1.1 200 OK\r\n\r\n' | nc -l -p $port

Conteúdo

Mesmo com isso, curl será bloqueado após receber a resposta, porque está aguardando que o servidor forneça um corpo. Você pode enviar mais dados para nc ou escolher uma resposta mais apropriada.

echo -e 'HTTP/1.1 204 No content\r\n\r\n' | nc -l -p $port

Observe que curl imprimirá apenas o que recebe - nada. Experimente curl -v para ter uma ideia do que está acontecendo.

    
por 22.08.2014 / 01:57
0

Noto que você está SINGLE citando a string que está sendo enviada na sua declaração echo. Assim, \ r e \ n são enviados literalmente e não o código para Newline e Return. Tente alternar o eco para aspas duplas (").

Você pode verificar isso usando:

 echo 'whatever\r\n' | od -cb
 echo "better\r\n" | od -cb

Sem uma terminação de linha, é provável que o programa nc não transmita a linha para o destino.

    
por 21.08.2014 / 22:51
0

Simplesmente,

netcat -l -c "printf 'HTTP/1.1 200 OK\r\n'" -p 8000

printf interpreta '\ r' e '\ n' como seqüências de escape. echo não.

    
por 02.09.2014 / 16:05