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
                                                  Сильно
                                                  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
                                                                это напоминает конвеер из лего, для сбора машинок из лего.
                                                                прикольно, весело, нихрена не полезно.

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

                                                                Самое читаемое