In Fire We Trust

In the darkest corner light will shine



18 Jul

Print This Post A dead simple webserver in bash
read in english 

Тук ще представя една относително елементарна идея за мизерен web сървър. Предупреждавам няма никаква функционалност и доста ограничени възможности.

Защо
Ами по ред причини. Може да искате да имате много елементарни статистики, да речем натоварване на машината. Може да искате да паркирате някаква много елементарна страничка. Не искате да пускате пълнофункционален сървър и може би още тон причини.

Предпоставки
Ще предположим следното:

  • Този web сървър ще е статичен
  • Ще сервира една единствена страница/файл независимо какво иска клиента
  • Ще работи на порт 8080

Теория на операцията

  • Трябва ни нещо което да посрещне входящата заявка - в случая ще ползваме netcat който популярно е наричан “TCP/IP swiss army knife” заедно с един малък wrapper script.
  • Трябва по някакъв начин да разберем че е дошла заявка - в случая това изобщо не ни интересува. В момента в който дойде трафик на нашия порт значи някой праща заявка, като свърши трафика значи заявката е свършила и ще си сервираме нашият отговор.
  • Трябва да конструираме правилен отговор за да не объркаме клиента който ни пита за нещо.
  • След това си вмъкваме нашето съобщение/файлче.
  • И накрая разбира се терминираме сесията.

Реализация
Wrapper script-а който ще напишем за netcatима една единствена цел. Да стартира netcat след като той излезе, като слага известно забавяне. Забавянето е необходимо от гледна точка на предпазване от DoS атака. Не е ефективно но е елементарно. А и все пак се очаква че това нещо няма да работи на production машина.

/var/www/bashserver/netcat-server.sh

#!/bin/bash
#
# Simple wrapper for keeping nc alive as it exits after successfull request
# at least on debian it acts this way.
# Author: vvitkov
# ver: 0.1
# date: 18.07.2007
# licence: CC NC-BY-SA 3.0
 
NC=$(which nc)
while [ ] ; do
  $NC -l -p 8080 -e /var/www/bashserver/webserver.sh
  sleep 1
done

Идеята на цялото това нещо е да се върти безкраен цикъл в който се пуска nc с определени параметри, чака се да излезе, изчаква се две секунди, и след това цялата въртележка на нова сметка.
Параметрите с които се пуска nc са както следва:

  • -l - локален режим. Тоест nc ще работи като сървър.
  • -p - порта на който ще слуша.
  • - при връзка изпълни този скрипт и върни каквото върне той.

С това първата ни задачка по посрещането на трафика е изпълнена.

/var/www/bashserver/webserver.sh

#!/bin/bash
#
# Simple bash webserver. Nothing fancy
# Author: vvitkov
# ver: 0.1
# date: 18.07.2007
# licence: CC NC-BY-SA 3.0
 
# Our simple file which we will serve
FILE="/var/www/bashserver/message.txt"
# Construct propper headers
echo -e "HTTP/1.1 200 OK\r"
echo -e "Content-Type: `/usr/bin/file -bi \"$FILE\"`\r"
echo -e "\r"
 
# Now lets spit our data
cat "$FILE"
 
# And lets finish the transmission.
echo -e "\r"

Простичко нали. И което е по интересното върши добра работа.

Идеи за развиване
Модифициране на webserver.sh така че да приема параметър с който да се описва порта на който да слуша. Втори параметър който да указва кой файл точно да се изпълнява а не да е твърдо закодирано за webserver.sh. Евентуално дори трети параметър който да се предава към файла който изпълняваме и да указва кой файл да връщаме.
Модифициране на webserver.sh така че да бъде научен да разбира от заявките, а не просто да сервира един единствен файл.

Заключение
Този вебсървър е със много ограничено приложение и кажи речи пълна неизползваемост, но за определени цели върши работа.

3 Responses to “A dead simple webserver in bash”

  1. 1
    bat.Serjo Says:

    1. По-голяма боза (претендираща да бъде уеб сървър) не съм виждал.
    2. На питон можеш на 20 реда да направиш истински уеб сървър, който да ти прави какви ли не статистики.
    3. Всякакви опити да се пише на език който няма елементарна концепция за типове е садистично. Ако sh, ksh, ash, bash, tcsh, csh, zsh, i t.n sh(it)-ове бяха пълнценни програмни езици днес света щеше да е едно по-добро място, и нямаше да има толкова интерпретации по темата обвивка.

  2. 2
    zeridon Says:

    Никой не е казал че това е пълноценен web сървър. Това е просто тъп прост и направо идиотски сървър който има за цел да сервира нещо супер елементарно.

  3. 3
    t3rr10n Says:

    wow, bat.Serjo ne si popliuva i mrazi shell-a :) dotolkova go mrazi, 4e sigurno i v benzinostancii shell ne stypva

Вашият коментар

You must be logged in to post a comment.


In Fire We Trust

Say NO to trud