GNU/Linux, Vim, LaTeX, полезные скрипты, визуализация данных, численные расчёты

20070830

Веб-сервер в одну строчку: версия 2.1

Алексей Свешников опубликовал в своём блоге пример веб-сервера, занимающего одну строчку на bash. Очень меня этой безделушкой порадовал. Красиво!

Однако его «сервер» у меня не заработал :)

Если запрос слать телнетом, то вроде что-то шлёт в ответ, а если запрашивать браузером или wget — нет. Пишется: ««127.0.0.1» разорвал соединение».

У меня возникло подозрение, что это из-за того, что скрипт начинает отвечать, не дождавшись конца HTTP запроса (а должен читать заголовки запроса до пустой строки). Я это исправил и wget заработал.

Также, при выдаче каталога хорошо бы отдавать Content-Type, подумал я. Например, без верного Content-Type wget сохраняет пустой файл.

И честно говорить, что это HTTP/1.0. Или поставить HTTP/1.1 и добавить Connection: close. (HTTP/1.1 applications that do not support persistent connections MUST include the "close" connection option in every message. —RFC2616)

Потом ещё я увидел, что символы перевода строк где-то «защищаются» bash. А именно во время вывода echo. Приходят литералы «\n» вместо кодов CRLF. А положено, чтобы шли именно CRLF. И заголовок ответа также должен заканчиваться пустой строкой.

В общем, вот мой вариант (эта версия у меня работает и с браузером, и с wget):

true; while [ $? -eq 0 ];do nc -vlp 8080 -c'(r=read;e=echo;$r a b c;E=NOTYET;while [ ${#E} -gt 0 ];do $r E;E=`$e $E|tr -d "\r\n"`;done;f=`$e $b|sed 's/[^a-z0-9_.-]//gi'`;h="HTTP/1.0";o="$h 200 OK\r\n";c="Content";if [ -z $f ];then($e -e $o;ls|(while $r n;do if test -f ${n}; then $e "<a href=\"/$n\">$n</a><br>";fi;done););elif [ -f $f ];then $e -e "$o$c-Type: `file -ib $f`\n$c-Length: `stat -c%s $f`\n";cat $f;else $e -e "$h 404 Not Found\n\n404\n";fi)';done


Эта версия ещё и скрывает подкаталоги текущего каталога, показывая только файлы. Набирать одной строчкой и смотреть результаты на 127.0.0.1:8080.

8 коммент.:

... комментирует...

Я рад, что понравилось :)

А какая у тебя система? Интересуют версии bash и netcat.

Я вот думаю, что сложнее всего будет написать скрипт так, чтобы он работал более чем в двух-трех дистрибутивах :(

jetxee комментирует...

Debian testing.
netcat 1.10-33
bash 3.1dfsg-8 (3.1.17)

Big 40wt Svetlyak комментирует...

У меня тоже заработало. Система - Debian stable.

Крайне полезная штука! Однозначно в алиасы ее!

jetxee комментирует...

В блоге Алексея в комментариях сообщают, что работает только с теми netcat, которые собраны с поддержкой опции -c. Проверить наличие опции:

$ nc -h

Дебиановские сборки, похоже, все работают.

dikiy.com комментирует...

Скрипт протестирован и отлично пашет на Internet Tablet N800 и рекомендован как простое средство для расшаривания файлов.

Так что выражаю благодарности и всё такое :)

jetxee комментирует...

Вот это здорово! Очень рад :)

Valdis комментирует...

работает на Kubuntu 7.10 X86_64 kernel: 2.6.22-14-generic #1 SMP Sun Oct 14 21:45:15 GMT 2007 x86_64 GNU/Linux

Анонимный комментирует...

Работает на Ubuntu 8.04 :)
Было бы сдорово сделать, чтобы скрипту можно было передавать в качестве параметра директорию, которую необходимо рашарить.

Отправить комментарий