Friday, December 22, 2006

 

HTTP сервер размером в 222 байта :)

В продолжение предыдущей идеи с передачей файлов по HTTP. Я не удержался и написал вполне полноценный (для нужд раздачи файлов на соседний компьютер) HTTP сервер:


while true; do nc -vv -l -p 8080 -c '( read a b c; file=`echo $b | sed 's/[^a-z0-9.]//g'`; if [ a$file = "a" ]; then ( ls | (while read f; do echo "<a href=$f>$f</a><br>"; done) ); else cat $PWD/$file; fi )'; sleep 1; done

(все это - одна команда, должна вводиться в одну строку. Тестировалось в linux/bash 3.1.17)

Вот и все :) Правда, на этот раз я опять решил отказаться от заголовков ответа, т.к. это слишком усложнит "команду", но при желании их можно взять из предыдущего примера. Этот сервер отдает все файлы, которые есть в текущем каталоге и пытается противодействовать попыткам его сменить. В случае, если запрашивается корневая директория, то управление передается своеобразному mod_index - т.е. выводится список файлов-ссылок. В конце добавлена задержка в 1 сек для того, чтобы была возможность убить его нажатием Ctrl-C.

Воистину, netcat одна из моих любимых программ!
Буду рад услышать замечания относительно сервера :)

p.s. Кто теперь осмелится заявить, что я не извращенец? :))
p.p.s. HTTP server bash netcat shell



UPD: новая версия сервера доступна здесь

Comments:
перепиши плиз под FreeBSD 6.1
 
Во фре все совсем по-другому, там netcat очень сильно отличается от GNU netcat...

Попробую, если опять делать будет нечего :)
 
Чего-то, как-то не стабильно работает. ФФ, то нормально отображает, то показав содержимое, выводит сообщение, что "соединение с сервером было сброшено". Плюс, Пришлось вынести скрипт в файл, иначе вместо результатов работы скрипта возращалось его содержимое. Причем,
(echo -e "HTTP/1.1 200\nContent-Disposition: attachment; filename=gena_na.png\nContent-Type: application/octet-stream\nConnection: close\n"; cat vim_mrxvt.png ) | nc -vv -l -p 8080
работает нормально. У кого-нить есть какие-нить предположения, почему так?
 
Это не глюк, это фича - в секунду обрататывается не более одного запроса - вызывается sleep, чтобы в этот момент можно было прибить команду по Ctrl-C. Дело в том, что это не продакшн сервер, а средство поделиться файлом с соседом - я посчитал, что мудрить с TRAP в данном случае излишне.
 
Можно ещё укоротить и сделать менее 222 байт, если:

1) заменить true на : (экономим 3 байта
2) условие [ a$file = "a" ] (проверки на пустое значение), заменить на [ -z "$file" ] (экономим ещё 2 байта)
3) можно заменить ls | while read f; do echo ...; done на for f in *; do echo ...; done и тоже сэкономить
4) можно убрать скобки, которыми выделен блок then.

-- Slava Semushin aka php-coder
 
Есть две машины
- Debian/testing
GNU bash, version 3.1.17(1)-release (i486-pc-linux-gnu)
nc v1.10
-CentOS release 4.4 (Final)
GNU bash, version 3.00.15(1)-release (i686-redhat-linux-gnu)
nc v1.10

На первой машине скрипт работает нормально, на другой - nc ругается на неправильные опции:
nc: invalid option -- c
Версии nc одинаковые, но выводы по nc -h различаются. Так что, получается, такой скрипт может сработать не на всех дистрибутивах.
 
php_coder:
Ты прав, можно еще уменьшить. Можно сделать shell golf по аналогии с Perl Golf и убрать конструкцию file=`echo $f | sed ...`, и подставить ее в cat $dir/$file, т.к. она используется только один раз.

Но это все уже другая история, если интересно - можно попробовать отдельным постом посоревноваться, но только добавив еще немного функциональности, а то так - слишком просто :)
 
dot22: версий netcat несколько, опция -c есть не во всех. В GNU netcat, который обычно ставится в linux, все работает, в FreeBSD - нет. Писать переносимую "команду" у меня, честно говоря, желания нет, есть задачки и поинтереснее :)
 
dot22, хм.. действительно, у меня почти на всех машинах оригинальный хоббитовский netcat, и работает тоже не везде. В GNU netcat про такую опцию ни слова..
 
]//g'`; if [ a$file = "a" ]; then ( ls | (while read f; do echo "<a href=$f>$f</a><br>"; done) ); else cat $PWD/$file; fi )'; sleep 1; done(все это - одна команда, должна вводиться в одну строку
 
Post a Comment



<< Home

This page is powered by Blogger. Isn't yours?