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.
    Метки:
    Поделиться публикацией
    Комментарии 77
    • +1
      Хабрапарсер покоцал кавычки.
    • +2
      • 0
        Спасибо, я искал автора, но не нашел, видимо потому что гуглил в англовебе. Добавил в пост.
        • 0
          Так я в англовебе и нашел пост, в котором была ссылка на авторский ЖЖ )
      • 0
        Проверить бы его в реальных условиях. На том же баше, например :)
        • +2
          Насчет полноценности я бы поспорил :) Из всех возможных http-статусов только 200 и 404 поддерживается.
          • +6
            Ну вы как дети малые :) Как будто кто то серьезно говорит о промышленном использовании. Это уже занудство имхо. В то время как автор привел всего лишь очередной пример нестандартного применения инструментов.
          • 0
            Bash — rulez!
            • +1
              Новость второй свежести. Да и сложно назвать это http-сервером на bash, ибо работает оно скорее благодаря netcat.
              • +1
                :)))

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

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

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

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

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

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

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

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

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

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

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

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

                                                        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
                                                          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
                                                      извращение — читать это без нормального форматирования
                                                      • 0
                                                        ах вот как, минусуите, ну и ладно. Я пойду и напишу свой хттп сервер, с форматированием, шлюхами и блекджеком
                                                        • –1
                                                          хотя, зачем мне хттп сервер?
                                                      • 0
                                                        Не честный пример, так как использует NetCat для управления соединениями.
                                                        Чисый bash http сервер, тем не менее, возможно написать используя /dev/tcp/127.0.0.1/80 (очевидно, что bash должен быть скомпилирован с этой фичей, на ubuntu без нее к сожалению)
                                                        • 0
                                                          К сожалению, с помощью /dev/tcp/… можно делать только исходящие соединения, так что сервер чист насколько это возможно :)
                                                        • 0
                                                          насколько данный гениальный скрипт будет работоспособен в системах, отличных от linux — таких как solaris, hpux, bsd?
                                                          • 0
                                                            Скрипт юзает специфическую опцию нетката, которую я встречал только на некоторых линуксах. В принципе, в ней нет ничего сложно и накатить патчик можно в какой угодно системе. А баш и так везде есть.
                                                            • 0
                                                              Единственная полезность данного — запустить на целевой юникс-машине и быстро что-то слить себе (есть, конечно, более элегантные способы...)
                                                              Но… попробовав скрипт на всех бсд (open+free+macos) ничего не получилось — отсутствует специфическая опция '-c'
                                                              Идея понравилась
                                                          • +2
                                                            Наверное я единственный кто не понял тут ни слова
                                                            • –5
                                                              это напоминает конвеер из лего, для сбора машинок из лего.
                                                              прикольно, весело, нихрена не полезно.

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