Executando ping entre um conjunto de hosts (todos para todos)

2

Eu tenho 4 servidores que quero pingar uns aos outros.

Execução esperada de ping :

ping from 1 to 2, 3, and 4 
ping from 2 to 1, 3, and 4 
ping from 3 to 1, 2, and 4 
ping from 4 to 1, 2, and 3 

Como conseguir isso por meio de um script bash ?

O login do usuário já está configurado com senha para todos os quatro servidores.

    
por prakash 11.01.2018 / 12:57

4 respostas

3

Para monitorar um número tão pequeno de máquinas, eu usaria SmokePing em vez de reinventar a roda com um script.

Ele fornecerá um feedback mais visual, dados históricos médios ao longo do tempo e até mesmo uma aparência profissional para mostrar mais um serviço e um bom trabalho feito aos outros. Pessoas e PHBs adoram feedback visual para monitorar as coisas.

Na verdade, usei-o para monitorar pontos críticos de minha infra-estruturação no passado quando tinha uma conexão de satélite não tão confiável com a Internet.

A configuração é feita em um pequeno arquivo de texto e é fácil adicionar novos endereços IP; Ele também tem uma interface web agradável. Você só precisa instalar um servidor da Web leve para isso.

Você pode monitorar praticamente qualquer coisa que possa ser monitorada via ICMP / pings; você também pode monitorar outros equipamentos críticos além desses 4 servidores.

Para ter uma ideia de como a interface funciona, consulte a interface para o mundo exterior de uma universidade

Veja também as imagens de exemplo:

Depois de instalar o servidor web e o Smokeping, o arquivo de configuração atual pode ser tão simples assim:

*** Targets ***
 probe = FPing

 menu = Top
 title = Network Latency Grapher
 remark = Welcome to this SmokePing website.

 + mysite1
 menu = Site 1
 title = Hosts in Site 1

 ++ myhost1
 host = myhost1.mysite1.example
 ++ myhost2
 host = myhost2.mysite1.example

 + mysite2
 menu = Site 2
 title = Hosts in Site 2

 ++ myhost3
 host = myhost3.mysite2.example
 ++ myhost4
 host = myhost4.mysite2.example
    
por 14.01.2018 / 12:24
2

Basta armazenar os nomes em uma matriz e fazer uma iteração, usando ssh para se conectar a cada host e ping:

ips=("server1" "server2" "server3" "server4");
for((i=0;i<${#ips[@]};i++)); do 
    for((k=0;k<${#ips[@]};k++)); do
        [[ $i -ne $k ]] && ssh "${ips[$i]}" ping -c1 "${ips[$k]}"; 
    done
done
    
por 11.01.2018 / 13:26
1

Você tem fping instalado? Isso provavelmente tornaria isso mais fácil:

$ hosts="www smtp"
$ for host in $hosts ; do 
    echo "$host:"; 
    ssh iv@$host "fping $hosts";
  done
www:
www is alive
smtp is alive
smtp:
www is alive
smtp is alive

(eu sei, é uma solução preguiçosa.)

    
por 11.01.2018 / 17:53
0

Funciona perfeitamente para a sua exigência

Ele fará o login server1 e ping somente para server2 e server3 e vice-versa

#!/bin/bash
while read line
do
ssh root@$line "sed "/$line/d" /root/p_final.txt |sed '/^$/d' | sed -r "s/\s+//g"|awk '{print $1}' | sed 's/^/ping -c2 /g'| sh" </dev/null
done </root/p_final.txt

onde o arquivo p_final.txt contém a lista de ip's um a um. Deixe-me saber se tem alguma dúvida

    
por 11.01.2018 / 19:41