Назад | Перейти на главную страницу

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

У вашего подхода несколько проблем.

Последовательности выхода

Управляющие последовательности не соблюдаются, если вы не используете -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 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 не передаст строку адресату.