Простой способ мониторинга состояния сервера.
Понадобилось мониторить состояние сервера, точнее не всего сервера, а определенного демона, на сервере запускаемого. Понятно, что самым простым способом мониторинга чего-то работающего в фоне, является просмотр соответствующих логов. Но такой способ на самом деле дает весьма мало интерактивности, надо постоянно заходить по SSH, ковыряться в этих самых логах. Хочется, чтоб при изменении состояния, или же по определенной команде от определенного пользователя, сервер нам все рассказывал сам.
Хорошо, если демон умеет при изменении состояния запускать некие пользовательские скрипты. Так умеет, например, демон OpenVPN или, например, демон небольшой промышленной системы метеоконтроля, который я использовал в данном примере.
Вкратце, имеется плата на Arduino, обрабатывающая показания с нескольких датчиков и передающая их в удобоваримом формате через COM-порт демону, запущенному на сервере. Демон умеет исполнять пользовательские скрипты, но вот беда (та же беда и с OpenVPN), если в скрипте написать что-то типа
echo "У нас изменились параметры, шеф, все пропало" это сообщение в лучшем случае уйдет неведомо куда. В худшем - вылезет пользователю, из под которого стартует демон, посреди рабочего сеанса в консоль.Самый простой способ всего этого избежать, при этом получив нужную интерактивность - отправлять сообщения определенному пользователю, созданному специально для данной цели.
Не так давно я делал похожего пользователя для отключения/перезагрузки сервера [КОПИЯ] . Фактически, пользователю была установлена псевдооболочка (на самом деле просто скрипт), выполняющий единственную команду перезагрузки/отключения системы. И идея создания псевдооболочек меня зацепила. Таким образом можно дать пользователю выполнять только ограниченный набор команд, да еще и обрабатывать параметры в скрипте по-своему, так что никакой злоумышленник, даже получив доступ по ssh ничего сделать не сможет, т.к. команды псевдооболочки ему неизвестны.
Почему бы не использовать такой способ и для целей мониторинга?
Первым делом создаем отдельную группу:
groupadd monusersгде
monusers - любое название группы на ваш вкус, ранее в системе не существующееСоздаем пользователя:
useradd -g monusers -d /home/meteomon -s /home/meteomon/monitor.sh meteomon
где:-g monusers группа пользователя (ранее созданная monusers)-d /home/meteomon домашний каталог пользователя-s /home/meteomon/monitor.sh - псевдооболочка для пользователя, скрипт, обрабатывающий команды.meteomon - имя пользователяЗадаем пользователю пароль (иначе не сможем залогиниться по ssh):
passwd meteomonСоздаем домашний каталог:
mkdir /home/meteomonМеняем владельца каталога на пользователя
meteomon:chown meteomon:monusers /home/meteomonМеняем права доступа на каталог:
chmod 500 /home/meteomonСоздаем в домашнем каталоге скрипт
monitor.sh о содержимом скрипта ниже.Меняем владельца и права доступа для скрипта
monitor.sh
chown meteomon:monusers /home/meteomon/monitor.sh
chmod 500 /home/meteomon/monitor.shПоскольку пользователь предполагается исключительно для мониторинга, разрешим ему всего одну команду - выход из системы. Соответственно, скрипт будет такой:
#!/bin/bash
echo "Hi, monitor operator"
echo "To exit enter byebye"
while [ "$KEYINPUT" != "byebye" ]; do
read KEYINPUT
doneВсе просто - ввод с клавиатуры попадает в переменную
KEYINPUT и пока она не равна byebye скрипт выполняется. Как только пользователь введет byebye, так прервется цикл, скрипт завершит работу, и пользователь автоматически выйдет из системы.Для отправки сообщений пользователю используем связку команд
echo и writeМожно создать отдельный скрипт со следующим содержимым:
#!/bin/bash
USERNAME="meteomon"
echo -e $1|write $USERNAME 2>/dev/nullположить его в каталог с доступными пользователям скриптами (например в
/usr/sbin) и установить права доступа, например в 755, чтобы пользователь для мониторинга мог получать сообщения от всех пользователей системы.Примечание: параметр
-e команды echo позволяет использовать специальные символы, такие, как перенос строки \n, а конструкция 2>/dev/null отправляет в нуль-устройство сообщение об ошибке, которое может возникнуть, если пользователь meteomon не вошел в систему.Осталось прописать соответствующую команду в пользовательском скрипте, вызываемом демоном, или исполняемом по cron'у:
...
DATA=`meteosrv checksystem`
/usr/sbin/techo $DATA
...
Внимание! Читайте документацию по демону, можно случайно нарваться на подводный камень, например, OpenVPN в некоторых случаях болезненно относится к ошибкам, случающимся в пользовательских скриптах.
Для Windows понадобится утилита
plink, обычно она идет вместе с ssh-клиентом PuTTY. В каталоге с ней создаем bat-файл следующего содержания.
testmon.bat:
plink -ssh -P 22 -l meteomon -pw meteomonpass 192.168.0.40
где вместо
meteomon надо подставить имя пользователя для мониторинга, вместо meteomonpass - заданный пароль, а вместо 192.168.0.40 настоящий адрес удаленного компьютера.
Источники
1. Bash, команда
writeЭто репост заметки из моего блога на сайте http://tolik-punkoff.com
Оригинал заметки находится здесь: http://tolik-punkoff.com/2017/03/12/pros