Você pode fazer algo como:
while IFS=' (' read <&3 ip id name rest; do
ssh -n -o ConnectTimeout=3 -o BatchMode=yes -o HostKeyAlias="$name" "$ip" poweroff &&
while ping -qw 10 -c3 "$ip"; do
sleep 1
done
done 3< list.txt
Algumas notas sobre esse código:
- Usamos a parte nome como HostKeyAlias, talvez
$id
faça mais sentido. Idealmente, você precisaria de algo anexado à chave do host do servidor sshd. - Usamos
-n
parassh
e o BatchMode, pois estamos fazendo um script autônomo aqui. Você também pode querer especificar uma dedicarUserKnownHostsFile
para essa finalidade. - Não executamos o loop
while
sessh
não for bem-sucedido. Você também pode querer sair do script com um erro nesse caso. Você também pode querer adicionar um limite superior nas iterações do loop while para considerar a falha de desligamento dos servidores. - Nosso loop faz 3 sondagens de ping separadas por 1 segundo e desiste após 10 segundos.
ping
(pelo menos a deiputils
na Debian retornará true se pelo menos uma sonda for respondida, o que deve cobrir a perda genuína de pacotes. O segundo de atraso entre 2 de 3 das sondas evita inundar o servidor como umwhile ping -c1
loop faria.O atraso extra após os 3 probes terem sido enviados e não respondidos, dá ao servidor tempo suficiente para desligar depois de ter destruído sua pilha de IPs.