Удаленное отключение группы серверов Linux (SNMP/Bonjour/socat?)
В моей подсети есть группа серверов linux, которые я хочу иметь возможность удаленно завершать работу с главной машины. Я не хочу, чтобы машины, не являющиеся ведущими, должны были заранее координировать свои действия с мастером, то есть знать его IP-адрес и т. Д. Поэтому что-то, основанное на широковещательных или многоадресных сообщениях, может показаться очевидным подходом.
Я уже реализовал решение с socat
но мне было интересно, есть ли лучшее, менее специализированное решение, например, использующее одну из установленных служб, поддерживающих многоадресную передачу, такую как SNMP или Bonjour?
Мое решение заключается в следующем. На всех неосновных машинах я бегу:
$ socat UDP4-RECVFROM:6666,broadcast,fork SYSTEM:'hostname; shutdown now'
Это говорит socat
прослушивать широковещательные сообщения через порт 6666, а когда он получает сообщение, он возвращает имя хоста и выключает компьютер.
Теперь любая машина в той же подсети может завершить работу всех машин, на которых она запущена, с помощью следующей команды (она ожидает ввода, поэтому введите что-либо, например, bye
):
$ socat STDOUT UDP4-DATAGRAM:255.255.255.255:6666,broadcast
bye
Это будет транслировать сообщение (в этом случае bye
), socat
затем выведет имена хостов, возвращенные всеми машинами, которые прослушивали широковещательные сообщения через порт 6666.
Очевидно, что в этом подходе нет защиты - если какая-либо машина в той же подсети передает что-либо на порт 6666, то системы выключатся. Можно добавить простой дополнительный слой - вместо того, чтобы просто запустить hostname; shutdown now
Можно запустить сценарий, который фактически проверяет то, что транслировалось, и отключается только в том случае, если видно длинное случайное число, которое должно быть известно только заинтересованным сторонам.
2 ответа
отключается только в том случае, если видно длинное случайное число, которое должно быть известно только заинтересованным сторонам.
Что ж, если вы согласны с этим уровнем координации, тогда просто установите главный хост SSH для всех остальных серверов и запустите shutdown
командуй таким образом. Серверы должны знать только длинное случайное число, то есть открытый ключ мастера.
(Соответствующий закрытый ключ не ограничен одним мастером; вы можете скопировать ~/.ssh/id_*
файл, где вам нужно.)
Bonjour / Avahi является чисто механизмом обнаружения и не поддерживает широковещательные команды, но вы можете использовать его здесь, чтобы перечислить все машины в подсети (либо с помощью общей службы "рабочая станция", либо с помощью определенной пользователем).
Поскольку вы должны выполнить команду для "не-мастера", я предполагаю, что есть какая-то координация между мастером и не-мастером. Таким образом, вы можете использовать ssh с аутентификацией пары ключей ssh для удаленного выполнения команды следующим образом:
ssh -i /path/to/pubkey @server 'shutdown -H now'