Ненормальное программирование

индекс
287,20

HTTP сервер на bash

Вполне себе полноценный HTTP сервер, написаный на bash, одной строкой.

:; while [ $? -eq 0 ]; do nc -vlp 8080 -c'(r=read; e=echo;$r a b c; z=$r; while [ ${#z} -gt 2 ]; do $r z; 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 $o; ls|(while $r n; do if [ -f «$n» ]; then $e «`ls -gh $n`»; fi; done);); elif [ -f $f ]; then $e «$o$c-Type: `file -ib $f`\n$c-Length: `stat -c%s $f`»;$e; cat $f; else $e -e «$h 404 Not Found\n\n404\n»; fi)'; done

Автор сего извращения любопытного проекта — Alexey Sveshnikov.
+149
17 августа 2008, 08:39
46

комментарии (74)

+1
Kalan #
Хабрапарсер покоцал кавычки.
+4
mifa #
Хм. Сообщил об ошибке. Типографизация внутри тега «code», мягко говоря, не эффективна :)
+1
bO_oblik #
Я уже дня три назад об этом писал, сказали поправят, но еще не поправили :-(
+1
bubuq #
Они вам не поверили )
+2
mahoro #
alexey.sveshnikov.ru/httpd.sh
вот здесь можно скачать этот скриптик в виде plan text.
+2
0x62ash #
0
mifa #
Спасибо, я искал автора, но не нашел, видимо потому что гуглил в англовебе. Добавил в пост.
0
0x62ash #
Так я в англовебе и нашел пост, в котором была ссылка на авторский ЖЖ )
0
gats #
Проверить бы его в реальных условиях. На том же баше, например :)
+2
zw0rk #
Насчет полноценности я бы поспорил :) Из всех возможных http-статусов только 200 и 404 поддерживается.
+6
Halt #
Ну вы как дети малые :) Как будто кто то серьезно говорит о промышленном использовании. Это уже занудство имхо. В то время как автор привел всего лишь очередной пример нестандартного применения инструментов.
0
eigrad #
Bash — rulez!
+1
Aesthete #
Новость второй свежести. Да и сложно назвать это http-сервером на bash, ибо работает оно скорее благодаря netcat.
+1
kyzia #
:)))

когда то был еще проект веб-сервера на пхп)
–10
Arendil #
А пхп как работает без «родительского» серевера? Или там система сервер->пхп->сервер? )
Или там прогу юзали, которая из пхп исполняемый файл компилит?
Заинтриговали :)
+2
kyzia #
насколько я понимаю он работает просто через пхп-интерпретатор.

скачать можно здесь — www.jaslabs.com/DownloadFiles/nanoweb_2.2.8.tgz
+3
elfiki #
пхп это полноценный язык програмирования, а потом уже модуль для апача и иже с ними…
–9
dime #
Нет, конечно.
И вы сами убедились бы в этом, если бы те повторяли тупо эти байки для чайников, а хотя бы раз попробовали воспользоваться им как «полноценным языком». Там та-а-акие спецэффекты вылазят — мама не горюй! :)
Шаблонизатор — переросток, не более.

ЗЫ. Ой, щаз быдлокодеры понабегут-набегут. Которые сами ничего не пробовали сделать, но Рабинович им напел… про «полноценный языг», ага.
–3
Carry #
уж далеко не последний по полноценности.
я клиент торрента кстати на нем делал для кэширования на трекере. Правда я им сейчас не пользуюсь т.к. доводить до ума некогда, к тому же нашел хорошую альтернативу на perl.
+2
dime #
Поражает до глубины души мужество и отвага людей, способные гланды… через жопу… автогеном… Понять причину этого безумия мне не дано. :) Зачем было не воспользоваться чем-то более удобным?
ЗЫ. Минусы — не мои, я их не ставлю из принципа.
+1
Carry #
а трекер (не веб морда, а именно трекер) тоже на ПХП написан.
а клиент, кстати, из командной строки запускается, ему http-сервер совсем и не нужен.
+3
Carry #
А Вы, сами если и не быдлокодер, то на холиварщика точно похожи)))
+1
Ventura #
C точки зрения машины Тьюринга очень даже язык программирования. Даже с запросом на ООП. Правда интерпретируемый.
Python — тоже интерпретируемый.
Языки просто разные. Разные возможности.
Или вы Basic не считаете языком программирования?

P.S. Я думаю негативное отношение к PHP возникает либо от неправильного понимания области его применения либо от огромного кол-во «быдлокодеров» на нем пишущего.
–1
dime #
Про полноту я ничего не говорил. И про бейсик тоже.
Понимание области применения пхп у меня правильное — шаблонизатор-переросток для изготовления домашних страничек.
Ну, эквивалентен машине Тьюринга. Так брейнфак тоже эквивалентен машине Тьюринга.
Ну, ООП спёрли из явы зачем-то совершенно бездумо… Особенно меня поразило зачем спёрли интерфейсы :)
Ну, трекер можно написать… Дык и на баше, вон, хттп-стервер можно написать, но это же прикол, а не повод :).
Чем скорее это кривое недоразумение издохнет, тем лучше будет.
+1
Ventura #
Почему-то я не поддерживаю вашего пессимизма )
PHP-шаблонизатор — это клише. Весьма необоснованное.
Я ведь не пытаюсь доказать, что PHP лучшие ли хуже Java, Ruby, Phyton, C (++). Ну разные возможности, отсюда разные сферы применения.
Насчет переростка для домашних страничек вы загнули. Перечислять крупные проекты, которые написанны на PHP?
Wikipedia, Digg, Flickr. Достаточно?
А то, что при неправильном проектировании от языка ничего не зависит? Тормоза twittera забыли?
По вашему MySQL — тоже жалкая и никому не нужная пародия на PostgreSQL (ORALCE, DB2, нужное подставить)?
–1
dime #
>А то, что при неправильном проектировании от языка ничего не зависит?

Если вы перечитаете мой ответ, то, возможно, поймёте, что с этим я не спорил. И на баше можно хттп-сервер написать, повторюсь :). И тетрис на авке. И википедию на пхп. Вопрос в другом — зачем же так себя мучить? :) И, главное, зачем же так мучить тех, кто это потом поддерживать станет? :(

И возможности не при чём. Ну, есть там «возможности». Напихали, как в бейсик в своё время. Язык экстенсивного развития. Бездумная и безумная несистематизированая свалка всего на свете зачастую в нескольких экземплярах с уродским синтаксисом впридачу. Язык должен помогать программисту писать лаконичные, логичные, ясные и сопровождаемые программы. В _этом_ смысле пхп — полное дерьмо.
0
Ventura #
Я даже не буду спрашивать почему он тогда так популярен.
Предвижу ответ: «PHP — для быдлокодеров».
+1
TimTowdy #
Сто раз уже отвечали на этот вопрос — низкий порог вхождения.
+2
dime #
Неужели из-за того, что это мощный, изящный, логичный и красивый язык программирования с ясным синтаксисом и чётко выстроеной парадигмой? :)
0
Ventura #
Холивар :)
Нет, это обычный молоток, чтобы забивать гвозди. Изящество ему никчему.
С другой стороны на нем сложно написать такой ужас (синтаксический), как на C, Perl, Python.
0
dime #
Шуруп можно забить и камнем, но приятнее, полёзнее, качественнее и быстрее всё же вкрутить его шуруповёртом. Кстати, потом можно будет его и открутить если что, в отличии от. Да даже и гвоздь приятнее забивать качественным молотком с гладкой непроскальзывающей рукояткой и бойком из стали нужной твёрдости, чем куском мягкого плющащегося железа, периодически соскакивающего с занозистой и кривой палки-суковатки :).
Про синтаксический ужас я бы поспорил. По-моему, пхп сам по себе уже синтаксический ужас :(.
0
dpritula #
за интерфейсы SPL — разработчикам отдельное спасибо
+2
dime #
А при чём здесь SPL??? Это ведь библиотека?
Я про интерфейсы. Которые interface. Видите, вы даже не в курсе :). Вот и я в недоумении — зачем они нужны в динамическом интерпретируемом языке.
0
Ventura #
Ну наверное для структурирования кода. И еще для множественного наследования.
–2
dime #
Лишняя сущность. По-моему просто пёрли механизм ООП из явы, заодно прихватили и интерфейсы :) даже не подумавши почему без них (или аналога) невозможно жить в яве и почему они никому не нужны здесь.
Теоретически, можно волевым решением и угрозой увольнения заставить разработчиков «структурировать» код интерфейсами, но, по-моему, гораздо практичнее и полезнее заставить их писать документацию :).
Множественное наследование интерфейсов бесполезно при отсутсвии пользы от самих интерфейсов.
0
dpritula #
айайай! Вы даже не удосужились глянуть на страницу www.php.net/~helly/php/ext/spl/ — страницу этой самой библиотеки.

Все дело в том, что эта библиотека дала возможность использовать нативные интерфейсы RecursiveIterator, IteratorAggregate, OuterIterator, Countable, SplObserver и достаточное количество абстрактных классов для построения сложных систем.

А нужны они по одной простой причине — для написания качественного, расширяемого кода.

Посмотрите limb, onPHP, mzz — сложные и интересные объектные струтктуры — и Ваш сарказм заметно поубавится :)
0
preprocessor #
на лимб не то чтобы смотреть, о нем думать страшно.
0
dpritula #
почему? что там такого outstanding, что заставляет Вас так говорить? На всякий случай — говоря о лимбе, я имел ввиду стиль, код и подход к решению определенных задач
0
dime #
Лишняя сущность в динамических языках. Если бы её небыло ничего бы не изменилось. Что вы своей библиотекой? Какое она имеет отношение к конкретной языковой конструкции? То, что кто-то не поленился и понаписал их туда? :)
0
dpritula #
Я «пришел» в php из Flash/Flex, имея вобщем-то немалый «багаж» в архитектурировании приложений. Продирался довольно долго через отсутствие полноценного контекста приложения. Упрощал сам несколько раз решения, отказывался от шаблонов проектирования, к которым привык. Что-то вырисовал для себя, чем сейчас и пльзуюсь.

Интерфейсы абсолютно не лишние (по крайней мере для меня). Самый простой пример — инверсия зависимостей (базовые зависимости — это интерфейсные зависимости) Это отлично применимо и к динамическим языкам и к любым другим. Еще один пример — реализация паттерна Наблюдатель в интерфейсах. Отличная вещь, которая в купе с memcached, паттерном ActiveRecord и IdentityMap позволила выжить довольно сложному высоконагруженному проекту и показать производительность на 30% выше при прочих равных в сравнении с процедурным кодом.

А то, что кто-то не поленился — честь и хвала :)
0
ViR2 #
а когда-то и полноценный сервер на vb :)
–12
etc #
Пусть он его сам и юзает xDDD
НЛО прилетело и опубликовало эту надпись здесь
0
catsmile #
да, нас тут много, сторонников-то.
–7
etc #
Это не больше, чем развлечение, практической пользы 0, имхо.
+12
mifa #
Это скорее искусство. Имхо.
0
burunduk2 #
пользы от этого исскуства много.
0
WarGasm #
Имхо бывают разные внештатные ситуации… Может когда и пригодится.
0
Aesthete #
Данный вариант полезен, когда, например, необходимо раздать по-быстрому какой-либо файл.
Оригинальная идея вот: alexey.sveshnikov.ru/blog/2006/12/22/hint-9-swiss-army-knife/
Вот тут ещё это обсуждалось: www.opennet.ru/tips/info/1352.shtml
+1
kr1z #
Занятная идея. Порадовал :)
+6
stolen #
Насчет извращений: тетрис и арканоид на sed меня сильнее впечатлили :)
+2
bubuq #
Textmode quake и его друзья:

Что вы, какой тетрис.
0
etc #
Сильно
0
Alexus #
еще есть FTP-сервер на Javascript. Запускать не пробовал.
тетрис на sed впечатлил, конечно, больше всего.
0
zt50 #
на javascript?
это вообще как возможно?
0
ilimer #
Запустил, работает. Работает используя вызовы java.
+1
tenshi #
о, убийца лайти и энжиникса? =)
+1
fixx #
скорее, убийца апача=)
0
arto #
bash: nc: command not found
0
Aesthete #
Необходимо установить пакет netcat.
nc110.sourceforge.net/
0
Alexus #
Жду версию с поддержкой многопоточности ;)
В генту опция -с, похоже, не поддерживается.
Понравилась идея nc -l -p 8080 < file. Вот уж действительно «раздать файл по-быстрому». Как ни странно, браузер воспринимает почти нормально.
0
NickG #
работает:
emerge net-analyzer/netcat -av
[ebuild R ] net-analyzer/netcat-110-r8 USE=«crypt -ipv6 -static» 0 kB
0
Alexus #
странно, у меня не работает. Может, я что-то не так делаю?

host ~ # emerge net-analyzer/netcat -av
...
[ebuild   R   ] net-analyzer/netcat-110-r8  USE="crypt -ipv6 -static (-GAPING_SECURITY_HOLE%)" 0 kB 
...
host ~ # :; while [ $? -eq 0 ]; do nc -vlp 8080 -c'(r=read; e=echo;$r a b c; z=$r; while [ ${#z} -gt 2 ]; do $r z; done; f=`stat -c%s $f`»;$e; cat $f; else $e -e «$h 404 Not Found\n\n404\n»; fi)'; done $e «$o$c-Type: `file -ib $f`\n$c-Length: ` 
nc -h for help

host ~ # nc -c
nc: option requires an argument -- c
nc -h for help

host ~ # nc -c echo 
nc -h for help

host ~ # nc -h | grep -- -c
host ~ #
0
NickG #
nc -h | grep — -c
-c shell commands as `-e'; use /bin/sh to exec [dangerous!!]
… попробуйте удалить, а потом заново установить програму
использую портежи с mirror.yandex.ru/gentoo-distfiles/ и оверлей sabayon
вот список патчей, которые применяются при установке:

* 00_all_unstripped.patch.bz2… [ ok ]
* 01_all_glibc_resolv_h.patch.bz2… [ ok ]
* 02_all_arm_timer.patch.bz2… [ ok ]
* 03_all_posix_setjmp.patch.bz2… [ ok ]
* 10_all_nopunt.patch.bz2… [ ok ]
* 11_all_nosleep.patch.bz2… [ ok ]
* 12_all_single_verbose_ipv6.patch.bz2… [ ok ]
* 13_all_use_getservbyport.patch.bz2… [ ok ]
* 14_all_read_overflow.patch.bz2… [ ok ]
* 15_all_help_write_to_stdout.patch.bz2… [ ok ]
* 20_all_inet_aton.patch.bz2… [ ok ]
* 21_all_udp_broadcast_ipv6.patch.bz2… [ ok ]
* 22_all_quit_ipv6.patch.bz2… [ ok ]
* 23_all_dash_port.patch.bz2… [ ok ]
* 24_all_sh_c.patch.bz2… [ ok ]
* 50_all_aes_crypto.patch.bz2…
–2
re7 #
извращение — читать это без нормального форматирования
0
re7 #
ах вот как, минусуите, ну и ладно. Я пойду и напишу свой хттп сервер, с форматированием, шлюхами и блекджеком
–1
re7 #
хотя, зачем мне хттп сервер?
0
alex_www #
Не честный пример, так как использует NetCat для управления соединениями.
Чисый bash http сервер, тем не менее, возможно написать используя /dev/tcp/127.0.0.1/80 (очевидно, что bash должен быть скомпилирован с этой фичей, на ubuntu без нее к сожалению)
0
mahoro #
К сожалению, с помощью /dev/tcp/… можно делать только исходящие соединения, так что сервер чист насколько это возможно :)
0
RumataEstora #
насколько данный гениальный скрипт будет работоспособен в системах, отличных от linux — таких как solaris, hpux, bsd?
0
mahoro #
Скрипт юзает специфическую опцию нетката, которую я встречал только на некоторых линуксах. В принципе, в ней нет ничего сложно и накатить патчик можно в какой угодно системе. А баш и так везде есть.
0
locust #
Единственная полезность данного — запустить на целевой юникс-машине и быстро что-то слить себе (есть, конечно, более элегантные способы...)
Но… попробовав скрипт на всех бсд (open+free+macos) ничего не получилось — отсутствует специфическая опция '-c'
Идея понравилась
+2
pluser #
Наверное я единственный кто не понял тут ни слова
–5
burunduk2 #
это напоминает конвеер из лего, для сбора машинок из лего.
прикольно, весело, нихрена не полезно.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.