Desligamento remoto de um grupo de servidores linux (SNMP / Bonjour / socat?)

0

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.

    
por George Hawkins 19.04.2017 / 16:02

2 respostas

0

only shuts down if e.g. a long random number that should only be known to the interested parties is seen.

Bem, se você está bem com esse nível de coordenação, basta ter o host mestre SSH para todos os outros servidores e executar o comando shutdown dessa maneira. Os servidores só precisam conhecer um número aleatório longo, ou seja, a chave pública do mestre.

(A chave privada correspondente não está limitada a um único mestre; você pode copiar o arquivo ~/.ssh/id_* onde você precisar.)

O Bonjour / Avahi é puramente um mecanismo de descoberta e não suporta comandos de transmissão , mas você pode usá-lo aqui para listar todas as máquinas na sub-rede (pelo serviço "workstation" genérico ou um personalizado).

    
por 19.04.2017 / 16:29
0

Como você tem que executar um comando em "não-mestre", eu suponho que haja algum tipo de coordenação entre mestre e não-mestre. Então você poderia usar o ssh com autenticação de par de chaves ssh para executar o comando remotamente assim:

ssh -i /path/to/pubkey @server 'shutdown -H now' 
    
por 19.04.2017 / 16:36