пятница, 7 марта 2014 г.

FreeBSD микро "web-сервер" на inetd и bash

Недавно, хотя скорее довольно давно появилась необходимость смотреть определённую информацию с сервера на FreeBSD. Подключаться по ssh каждый раз лень, да и периодичность примерно раз в два-три дня. Идеальным решением было бы смотреть через браузер, но ставить ради подобной хотелки web-сервер мне показалось странно, но как оказалось и совсем не обязательно. В FreeBSD (по крайней мере в версиях с 8 по 9.2) есть замечательная вещь под названием inetd (не путать с init.d). Из руководства по FreeBSD можно прочесть про inetd следующее:

The inetd(8) daemon is sometimes referred to as a Super-Server because it manages connections for many services. Instead of starting multiple applications, only the inetd service needs to be started. When a connection is received for a service that is managed by inetd, it determines which program the connection is destined for, spawns a process for that program, and delegates the program a socket. Using inetd for services that are not heavily used can reduce system load, when compared to running each daemon individually in stand-alone mode.
nano /etc/inetd.conf

Из этого можно вынести примерно следующее, inetd или супер-сервер висит себе спокойно в памяти если какая то программа хочет подсоединится к компу по сети, inetd определяет. что это за сервис и запускает согласно сервису соответствующую программу, которая уже занимается обработкой соединения. Сделано это для того, что бы программы обращение по сети к которым происходит довольно редко, не висели постоянно в памяти и не потребляли ресурсы в ожидании что кто то постучит.
Как то так.

Что же нам потребуется. что бы смастерить такую штуку? Перво наперво придумаем какое нибудь хитрое название для сервиса  и назначим ему порт.
Всё это делается в файле /etc/services, для примера возьмём имя mweb, и tcp порт номер 47559, что бы жизнь мёдом не казалась.
Итак, куда нибудь в конец добавляем:

mweb            47559/tcp

Теперь сообщим inetd, что нужно делать если кто то решиться обратиться к этому сервису.
В файл /etc/inetd.conf добавим:

mweb      stream  tcp     nowait  nobody  /home/user/web.sh

где mweb - название сервиса, stream - тип сокета, tcp - протокол, nowait - открывать новый сокет для каждого подключения (здесь могут быть разные параметры с помощью которых можно задать максимальное количество детей процесса, максимальное количество соединений с одного IP и т.д. подробней), nobody - пользователь от имени которого будет выполнен скрипт/программа, /home/user/web.sh - сам скрипт который будет запускаться.

/etc/rc.d/inetd restart

Осталось создать скрипт
nano /home/user/web.sh

#!/bin/sh
echo "Hello world!"


Теперь при обращении через браузер (и не только) на порт 47559 увидим результат выполнения скрипта. Хотел вывести страничку с html-кодом, но blogger не позволяет вставлять тэги, или просто я не осилил.

Комментариев нет :

Отправить комментарий