Я пытаюсь настроить минимальный веб-сервер с помощью netcat (nc). Например, когда браузер вызывает localhost: 1500, он должен показать результат функции ( дата в примере ниже, но в конечном итоге это будет программа на Python или c, которая выдаст некоторые данные). Мой маленький веб-сервер netcat должен быть циклом while true в bash, возможно, таким простым:
while true ; do echo -e "HTTP/1.1 200 OK\n\n $(date)" | nc -l -p 1500 ; done
Когда я пробую это сделать, браузер показывает доступные на данный момент данные в момент запуска nc. Я хочу, чтобы браузер отображал данные в тот момент, когда браузер их запрашивает. Как я могу этого добиться?
Ответы:
Попробуй это:
Это
-c
заставляет netcat выполнять указанную команду в оболочке, поэтому вы можете использовать echo. Если вам не нужно эхо, используйте-e
. Для получения дополнительной информации по этому поводу попробуйтеman nc
. Обратите внимание, что при использованииecho
ваша программа (date
-replacement) не может получить запрос браузера. Итак, вы, вероятно, наконец захотите сделать что-то вроде этого:Где
yourprogram
должны выполняться такие протоколы, как обработка GET, отправка HTTP 200 и т. Д.источник
while true; do echo -e "HTTP/1.1 200 OK\n\n $(date)" | nc -l localhost 1500; done
It is an error to use this option in conjunction with the -l option
-p
опции вместе с ней-l
является ошибкой, официальный сайт netcat использует оба варианта в своих примерах. См .: nc110.sourceforge.netnc
: Hobbit (оригинал), BSD / Mac OS X и GNU (самый старый из них, который больше не поддерживается). Также есть Ncat от Nmap . Я поднимаю это , потому что я думаю , что стоит отметить , что-l
и-p
флаги вместе только считается ошибкой в BSD привкусом пс, следовательно , альтернативный синтаксис задается @matlehmannДонно, как и почему, но мне удалось найти это, и это работает для меня, у меня была проблема, я хотел вернуть результат выполнения bash
ПРИМЕЧАНИЕ. Эта команда была взята из: http://www.razvantudorica.com/08/web-server-in-one-line-of-bash
это выполняет тест сценария bash и возвращает результат клиенту браузера, подключающемуся к серверу, выполняющему эту команду на порту 8080
Мой скрипт делает этот банкомат
и мой веб-браузер показывает
Просто удивительно!
источник
-k
флаг, а не добавляяConnection: keep-alive
его в заголовок запроса.Добавьте
-q 1
вnetcat
командную строку:источник
-q
1 не работает вCentOS
6.x , что должно быть использовано дляCentOS
6.x , где он сказал:nc: invalid option -- 'q'
.while true; do tail -f /usr/local/freeswitch/log/freeswitch.log | nc -l 9999; done &
/usr/local/freeswitch/log/freeswitch.log
?-q 1
сработало для меня в Ubuntu 18.04. Надеюсь, это поможет.Проблема, с которой вы столкнулись, заключается в том, что nc не знает, когда веб-клиент завершил свой запрос, поэтому он может ответить на запрос.
Веб-сеанс должен выглядеть примерно так.
Строки, начинающиеся с «\ n», являются просто пустыми строками без пробела и содержат не более чем символ новой строки.
У меня есть мой bash httpd, запущенный xinetd, учебник по xinetd . Он также записывает дату, время, IP-адрес браузера и весь запрос браузера в файл журнала и вычисляет Content-Length для ответа заголовка сервера.
Чтобы добавить больше функций, вы можете включить.
Удачной тусовки!
источник
У меня была такая же потребность / проблема, но у меня здесь ничего не работало (или я не все понимал), так что это мое решение.
Я публикую свой файл minimal_http_server.sh (работающий с моим / bin / bash (4.3.11), но не с / bin / sh из-за перенаправления):
И мой a_script.sh (с вашей точки зрения):
источник
read
иtr
) и незначительный ([
после elif). Я не воспроизводю вашу проблему. Я не понимаю, почему Minimal_http_server.sh вызывает эти 1-секундные интервалы. Вы можете определить, является ли это минимальным_http_server.sh или вашим "a_script.sh", который является неисправным, выполнив несколько раз (с той же скоростью, что и ваши запросы curl) ./a_script.sh после установки переменной среды REQUEST.Другой способ сделать это
Давайте протестируем это с помощью 2 HTTP-запросов, используя curl
В этом примере 172.16.2.6 - это IP-адрес сервера.
На стороне сервера
Сторона клиента
Если вы хотите выполнить другую команду, замените $ (date).
источник
источник
read line<pipe
подождем покаnc
напишутpipe
? Но на этом этапе я думаю, что запрос выполнен до того, как будет написан ответ ..?Вот прелесть небольшого веб-сервера на bash , я нашел его в Интернете, раздвоил копию и немного приукрасил - он использует
socat
илиnetcat
я тестировал его сsocat
- он самодостаточен в одном сценарии и генерирует свой собственный файл конфигурации и значок.По умолчанию он запускается как файловый браузер с поддержкой Интернета, но его легко настроить с помощью файла конфигурации для любой логики. Для файлов он передает потоковые изображения и музыку (mp3), видео (mp4, avi и т. Д.) - я тестировал потоковую передачу файлов различных типов на устройства Linux, Windows и Android, включая умные часы!
Я думаю, что на самом деле он транслируется лучше, чем VLC. Я обнаружил, что это полезно для передачи файлов удаленным клиентам, у которых нет доступа кроме веб-браузера, например умных часов Android, без необходимости беспокоиться о физическом подключении к USB-порту.
Если вы хотите попробовать, просто скопируйте и вставьте его в файл с именем bashttpd, а затем запустите его на хосте с помощью
$> bashttpd -s
Затем вы можете перейти на любой другой компьютер (при условии, что брандмауэр не блокирует входящие TCP-соединения на порт 8080 - порт по умолчанию, вы можете изменить порт на любой другой, используя глобальные переменные в верхней части скрипта).
http://bashttpd_server_ip:8080
источник
main
функцию, где написано[ "${REQUEST_METHOD}" = "GET" ] || fail_with 405
: github.com/AdamDanischewski/bashttpd/blob/master/bashttpdLOL, супер хромой хак, но, по крайней мере, curl и firefox его принимают:
Тебе лучше скорее заменить его чем-нибудь подходящим!
Ах да, мои
nc
были не совсем такие, как у вас,-p
вариант не понравился .источник
Если вы используете Apline Linux, Netcat BusyBox немного отличается:
источник
Введите nc -h и посмотрите, доступна ли у вас опция -e . Если да, вы можете создать сценарий, например:
script.sh
и запустите его так:
Обратите внимание, что параметр -e должен быть включен при компиляции, чтобы он был доступен.
источник
Я думаю, проблема в том, что все перечисленные решения не работают, присуща самой природе службы http, каждый установленный запрос выполняется с другим клиентом, а ответ должен обрабатываться в другом контексте, каждый запрос должен разветвлять новый экземпляр ответа ...
В настоящее время решения , я думаю , что это
-e
изnetcat
но я не знаю , почему не работает ... Может быть , это мояnc
версия , что я испытываю наopenwrt
...с участием
socat
ним работает ....Я пробую это https://github.com/avleen/bashttpd
и это работает, но я должен запустить сценарий оболочки с этой командой.
socat
Иnetcat
образцы на GitHub не работает для меня, ноsocat
я использовал работу.источник
reuseaddr
флагом ты сделал мой день! СПАСИБОНа самом деле, лучший способ изящно закрыть соединение - это отправить
Content-Length
заголовок, как показано ниже. Клиент (вроде быcurl
закроет соединение после получения данных.источник