Не можете передать эхо в Netcat?
У меня есть следующая команда:
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
3 ответа
Ваш подход имеет несколько проблем.
Escape-последовательности
Экранирующие последовательности не соблюдаются, если вы не используете -e
переключатель.
echo -e 'HTTP/1.1 200 OK\r\n'
Без -e
Вы отправляете обратные слеши и дословно письма. Выше образует полную строку статуса HTTP.
протокол
Одна только строка состояния не является ответом. Формат требует двух CRLF
- Один как часть самой строки состояния
- Один для завершения заголовка ответа
Попробуй это
echo -e 'HTTP/1.1 200 OK\r\n\r\n'
вызов netcat
-c
Флаг явно неверен, потому что он ожидает аргумент команды.
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
не.
Я замечаю, что вы ЕДИНСТВЕННО цитируете строку, отправляемую в вашем выражении echo. Таким образом, \r и \n отправляются буквально, а не код для новой строки и возврата. Попробуйте переключить эхо в двойные кавычки (").
Вы можете проверить это, используя:
echo 'whatever\r\n' | od -cb
echo "better\r\n" | od -cb
Без завершения строки вполне вероятно, что программа nc не будет передавать линию к месту назначения.