Однако его «сервер» у меня не заработал :)
Если запрос слать телнетом, то вроде что-то шлёт в ответ, а если запрашивать браузером или
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.
Я вот думаю, что сложнее всего будет написать скрипт так, чтобы он работал более чем в двух-трех дистрибутивах :(
Debian testing.
netcat 1.10-33
bash 3.1dfsg-8 (3.1.17)
У меня тоже заработало. Система - Debian stable.
Крайне полезная штука! Однозначно в алиасы ее!
В блоге Алексея в комментариях сообщают, что работает только с теми netcat, которые собраны с поддержкой опции -c. Проверить наличие опции:
$ nc -h
Дебиановские сборки, похоже, все работают.
Скрипт протестирован и отлично пашет на Internet Tablet N800 и рекомендован как простое средство для расшаривания файлов.
Так что выражаю благодарности и всё такое :)
Вот это здорово! Очень рад :)
работает на 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 :)
Было бы сдорово сделать, чтобы скрипту можно было передавать в качестве параметра директорию, которую необходимо рашарить.
Отправить комментарий