Не можете передать эхо в 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

  1. Один как часть самой строки состояния
  2. Один для завершения заголовка ответа

Попробуй это

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 не будет передавать линию к месту назначения.

Другие вопросы по тегам