Удаленное отключение группы серверов Linux (SNMP / Bonjour / socat?)

459
George Hawkins

У меня есть группа серверов 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можно запустить скрипт, который на самом деле проверяет то, что транслировалось, и выключается, только если видно длинное случайное число, которое должно быть известно только заинтересованным сторонам.

0
Я написал простой файл службы systemd, который можно установить для запуска первой из вышеприведенных команд `socat` на машине при запуске. См. Https://gist.github.com/george-hawkins/21f98e4061fed8d4bb3d9183093c0726. George Hawkins 7 лет назад 0
Мы рады, что вы сами ответили на вопрос, однако, чтобы сделать это очевидным здесь, на этом сайте, вы должны опубликовать ОТВЕТ в разделе «Ответ» ниже, а не просто включить его в свой вопрос. Пожалуйста, отредактируйте свой пост, чтобы он соответствовал этим критериям. Существует вынужденная задержка между публикацией ответа на ваш собственный вопрос и фактической возможностью пометить его как правильный ответ, но этот метод позволяет понять, что такое вопрос, а затем ответ на этот вопрос. music2myear 7 лет назад 1
Я надеялся на лучший ответ, то есть я показывал свой текущий подход и спрашивал, есть ли лучший, основанный на установленном протоколе, таком как SNMP или Bonjour. Но я могу разделить его на ответ (после того, как принудительная задержка закончилась) и посмотреть, как это происходит при голосовании. George Hawkins 7 лет назад 0
Хорошо. Тогда в вашем посте не хватало ясности. Если вы хотите лучшего ответа, это тоже хорошо. Возможно, используя некоторое форматирование и разбив свой пост с заголовками «Это то, что я делаю сейчас», «Это то, чего не нужно» и «Это то, что я хотел бы сделать», или аналогично Уточните свой запрос, чтобы было легче узнать, что происходит. music2myear 7 лет назад 0

2 ответа на вопрос

0
grawity

отключается, только если видно длинное случайное число, которое должно быть известно только заинтересованным сторонам.

Что ж, если вы согласны с этим уровнем координации, просто подключите главный хост SSH ко всем остальным серверам и выполните shutdownкоманду таким образом. Серверы должны знать только длинное случайное число, то есть открытый ключ мастера.

(Соответствующий закрытый ключ не ограничен одним мастером; вы можете скопировать ~/.ssh/id_*файл туда, где вам нужно.)

Bonjour / Avahi является чисто механизмом обнаружения и не поддерживает широковещательные команды, но вы можете использовать его здесь, чтобы перечислить все машины в подсети (либо с помощью общей службы «рабочая станция», либо с помощью определенной пользователем).

Спасибо за ваш ответ - я уже использую ssh (с ключами RSA) для рутинных взаимодействий между главным и отдельными не главными / подчиненными машинами. Однако см. Мой комментарий к ответу @ jehutyy. Ситуация выключения - это команда «один ко многим», а подход «socat» позволяет избежать зацикливания всех рабов. Я подумал, что, возможно, SNMP, Bonjour или что-то еще может обеспечить менее специализированный подход к этому (я получаю ваше замечание о Bonjour). Но, возможно, «socat» - лучший подход для моей установки, и если мне нужно больше, я должен взглянуть на какую-то полноценную систему управления ресурсами. George Hawkins 7 лет назад 0
0
jehutyy

Поскольку вы должны выполнить команду для «не-мастера», я предполагаю, что есть какая-то координация между мастером и не-мастером. Таким образом, вы можете использовать ssh с аутентификацией пары ключей ssh ​​для удаленного выполнения команды следующим образом:

ssh -i /path/to/pubkey @server 'shutdown -H now' 
На самом деле это тот подход, который я использовал до описанного выше `socat '. Однако есть один мастер и много неосновных или подчиненных машин - так что при таком подходе нужно обходить всех рабов. И в любой момент времени некоторая часть рабов уже будет в автономном режиме - так что можно увидеть множество сбоев ssh (ничего страшного). Но я подумал, что Bonjour или SNMP могут быть подходом - можно было бы узнать, кто рекламирует службу «завершение работы», а затем попросить машины, которые ответили, сделать это. George Hawkins 7 лет назад 0

Похожие вопросы