Пользователь
0,0
рейтинг
17 августа 2008 в 08:39

Разработка → 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.
mifa @mifa
карма
203,7
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (77)

  • +1
    Хабрапарсер покоцал кавычки.
    • +4
      Хм. Сообщил об ошибке. Типографизация внутри тега «code», мягко говоря, не эффективна :)
      • +1
        Я уже дня три назад об этом писал, сказали поправят, но еще не поправили :-(
        • +1
          Они вам не поверили )
    • +2
      alexey.sveshnikov.ru/httpd.sh
      вот здесь можно скачать этот скриптик в виде plan text.
  • +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
    это напоминает конвеер из лего, для сбора машинок из лего.
    прикольно, весело, нихрена не полезно.

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