У меня есть следующая команда:
echo 'HTTP/1.1 200 OK\r\n' | nc -l -p 8000 -c
и когда я curl localhost:8000
Я не вижу, как печатается HTTP / 1.1 200 ...
Я использую mac os x с netcat 0.7.1
Любые идеи?
#!/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
и тестирование с помощью:
curl localhost:8000
У вашего подхода несколько проблем.
Управляющие последовательности не соблюдаются, если вы не используете -e
переключатель.
echo -e 'HTTP/1.1 200 OK\r\n'
Без -e
, вы отправляете обратную косую черту и буквы дословно. Это формирует полную строку статуса HTTP.
Сама по себе строка состояния не является ответом. В формат требуется два CRLF
Попробуй это
echo -e 'HTTP/1.1 200 OK\r\n\r\n'
В -c
flag явно неправильный, потому что он ожидает аргумент команды.
echo -e 'HTTP/1.1 200 OK\r\n\r\n' | nc -l -p $port
Даже с этим, curl
будет заблокирован после получения ответа, потому что он ожидает, пока сервер предоставит тело. Вы можете отправить больше данных на nc
, или выберите более подходящий ответ.
echo -e 'HTTP/1.1 204 No content\r\n\r\n' | nc -l -p $port
Обратите внимание, что curl
напечатает только то, что получает - ничего. Пытаться curl -v
чтобы получить представление о том, что происходит.
Просто,
netcat -l -c "printf 'HTTP/1.1 200 OK\r\n'" -p 8000
printf
интерпретирует '\ r' и '\ n' как escape-последовательности. echo
не.
Я заметил, что вы ОДИН цитируете строку, отправляемую в вашем операторе эха. Таким образом, \ r и \ n отправляются буквально, а не код для новой строки и возврата. Попробуйте переключить эхо на двойные кавычки (").
Вы можете проверить это, используя:
echo 'whatever\r\n' | od -cb
echo "better\r\n" | od -cb
Без завершения строки вполне вероятно, что программа NC не передаст строку адресату.