A dead simple webserver in bash
Владимир | 12/06/2009Тук ще представя една относително елементарна идея за мизерен 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 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.0 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 така че да бъде научен да разбира от заявките, а не просто да сервира един единствен файл.
Заключение
Този вебсървър е със много ограничено приложение и кажи речи пълна неизползваемост, но за определени цели върши работа.



