Eu tenho um grupo de servidores Linux na minha sub-rede que eu quero ser capaz de desligar remotamente a partir de uma máquina mestre. Não quero que as máquinas não-mestras tenham que se coordenar com o mestre antecipadamente, ou seja, saber seu endereço IP, etc. Portanto, algo baseado em mensagens de difusão ou multicast pareceria uma abordagem óbvia.
Já implementei uma solução com socat
, mas queria saber se havia uma solução ad-hoc menos melhor, por exemplo, usando um dos serviços estabelecidos multicast, como SNMP ou Bonjour?
Minha solução é a seguinte. Em todas as máquinas não mestras que eu executo:
$ socat UDP4-RECVFROM:6666,broadcast,fork SYSTEM:'hostname; shutdown now'
Isso diz ao socat
para escutar mensagens de broadcast na porta 6666 e quando ele recebe um, ele retorna o nome do host e desliga a máquina.
Agora, qualquer máquina na mesma sub-rede pode desligar todas as máquinas que executam isso com o seguinte comando (aguarda a entrada e insira qualquer coisa, por exemplo, bye
):
$ socat STDOUT UDP4-DATAGRAM:255.255.255.255:6666,broadcast
bye
Isso transmitirá a mensagem (neste caso, bye
), socat
, então, exibirá os nomes de host ecoados de volta por todas as máquinas que estavam ouvindo mensagens de difusão na porta 6666.
Obviamente, não há segurança com essa abordagem - se qualquer máquina na mesma sub-rede transmitir algo para a porta 6666, os sistemas serão desligados. Pode-se adicionar uma camada extra simples - em vez de apenas executar hostname; shutdown now
, é possível executar um script que, na verdade, verifica o que foi transmitido e só é desligado se, por exemplo, um longo número aleatório que só deve ser conhecido pelas partes interessadas é visto.