Я нашел похожий вопрос здесь, но ответа нет.
Я написал этот скрипт с именем answer.sh:
#!/bin/sh
echo "HTTP/1.1 200 OK
Hello World"
Если я убегу
./answer.sh | nc -c -l -p 8797
а затем перейдите к localhost: 8797 Я получаю веб-страницу только с текстом «Hello World» (это именно то, что я хочу).
но если я убегу
nc -l -p 8797 -e ./answer.sh
браузер сообщает, что соединение было прервано. Поэтому я пытаюсь
nc localhost 8797
чтобы увидеть, что происходит, и я получаю следующее:
HTTP/1.1 200 OK
Hello World
read(net): Connection reset by peer
Я хотел бы понять, что происходит и в чем (технически) разница между рабочим способом и другим.
Заранее спасибо.
Похоже, что на этот вопрос нет ответов. Я не могу тестировать nc -e
, так что это не полный ответ, но, возможно, он поможет начать разговор ...
Я рекомендую использовать заголовок Content-Length:
в ответе HTTP, например
#!/bin/sh
echo "HTTP/1.1 200 OK
Content-Length: 11
Hello World"
При использовании в ...
./answer.sh | nc -l -p 8797
... Я обнаружил, что это позволяет обычному браузеру выполнить запрос. Без него браузер не знает, когда прекратить чтение ответа, и будет ждать, пока сервер не закроет соединение.
Однако при подключении с nc localhost 8797
в качестве клиента это явно не имеет значения. nc
не интересуется заголовками HTTP и будет просто читать, пока сервер не разорвет соединение.
Идеально! Это было решение. Я только что протестировал, и он работает. Я также попытался (просто чтобы посмотреть, что происходит) установить параметр Content-Length на меньшее или большее число (чем реальное количество символов). Если я устанавливаю более низкое значение, содержимое обрезается до выбранного мной числа, если я устанавливаю большее значение, это дает мне ту же ошибку, которую я получил в начале (просто хотел проверить это). Так! Большое спасибо!