Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    434

    script bash per rilevare anomalie nei ping

    Ciao,
    sto cercando di scrivere uno script in bash per 1) pingare un po' di macchine nella mia rete privata (e fino a qui nessun problema) e, 2) qualora qualcuna di queste risultasse down, vorrei che lo scriptino 3) mi avvisasse via email (ho già installato sendmail, anche qui non dovrei avere nessun problema, ho qualche esperienza precedente con qmail, ma più o meno il funzionamento è quello).

    La cosa che non capisco come fare è infatti il punto 2)... mettiamo che il ping non "ritorni" o ci metta un tempo spropositamente alto, come me ne accorgo?

  2. #2
    Utente di HTML.it L'avatar di moskitoita
    Registrato dal
    Feb 2004
    Messaggi
    1,257
    Controlli l'output di "ping indirizzo -c 4" e compare "0% packet loss" è tutto ok
    "Aiuterò le forze dell'ordine a sventrare eventuali truffatori, eventuali assassini che abbiano utilizzato l'informatica per fini malvagi"

    Salvatore Aranzulla, 15 Aprile 2007, cognome&nome, La7

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    434
    Originariamente inviato da moskitoita
    Controlli l'output di "ping indirizzo -c 4" e compare "0% packet loss" è tutto ok
    è proprio qui il problema... cioè che dovessi controllare l'output di ping <indirizzo> non c'erano dubbi, il problema è come


  4. #4
    Utente di HTML.it L'avatar di untamed
    Registrato dal
    Sep 2004
    Messaggi
    831
    Ti consiglio di usare "fping", è un comando pensato apposta per questo tipo di script, molto comodo. Puoi impostare il timeout di attesa di risposta. E per mandare le email ti consiglio l'utility "email", facilissima da configurare, la puoi impostare anche con parametri tuoi di posta.

    "La fede in una missione divina è una delle tante forme di certezza che hanno afflitto la razza umana." - Bertrand Russell

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    434
    Grazie, fping è fantastico! (l'altro devo ancora provarlo)

    Però ancora c'è una cosa che non capisco (può dipendere dal fatto che non sono molto bravo a programmare in bash): come faccio ad ottenere quei valori? Intendo dire, se stessi programmando in un qualunque linguaggio di programmazione, farei una cosa del tipo:

    risultato = ping("nomehost");

    e poi saprei che ad esempio la funzione ping ritorna -1 su "host unreachable" e 0 se ha successo...

    In bash come posso fare una cosa simile? Cioè il passaggio che manca a me è l'elaborazione (o meglio ancora, la raccolta) dei dati.


  6. #6
    Utente di HTML.it L'avatar di untamed
    Registrato dal
    Sep 2004
    Messaggi
    831
    Io ho fatto così:

    codice:
    /usr/sbin/fping -t3000 -u ${servers[@]} 2>/dev/null > /root/servers_down.txt
    num_down=`/bin/cat /root/servers_down.txt|/usr/bin/wc -l`
    e poi controllo se $num_down è maggiore o uguale a 0. Probabilmente non è una cosa elegantissima ma funziona.
    "La fede in una missione divina è una delle tante forme di certezza che hanno afflitto la razza umana." - Bertrand Russell

  7. #7
    Originariamente inviato da Sifr
    Grazie, fping è fantastico! (l'altro devo ancora provarlo)

    Però ancora c'è una cosa che non capisco (può dipendere dal fatto che non sono molto bravo a programmare in bash): come faccio ad ottenere quei valori? Intendo dire, se stessi programmando in un qualunque linguaggio di programmazione, farei una cosa del tipo:

    risultato = ping("nomehost");

    e poi saprei che ad esempio la funzione ping ritorna -1 su "host unreachable" e 0 se ha successo...

    In bash come posso fare una cosa simile? Cioè il passaggio che manca a me è l'elaborazione (o meglio ancora, la raccolta) dei dati.

    In bash per raccogliere l'output di un programma si usano o gli apici inversi o $(comando ...)
    Quindi
    codice:
    dati=`comando 1 | asdasdas | xyz`
    equivale a
    codice:
    dati=$(comando 1 | asdasdas | xyz)
    L'unica differenza è che è possibile innestare più $( ), cioè ad esempio è ammissibile (e funziona) una cosa del tipo
    $(comando1 -l -a | cmd2 -x $(cmd3 asd) | cmd4)

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    434
    Perfetto! Grazie ad entrambi, a Vortex per il chiarimento e ad untamed per quelle linee (che, ammetto, ho copiato spudoratamente con qualche modifica sui parametri da passare a fping ).

    Solo un'ultima cosa riguardante quel " -u ${servers[@]} 2 ": l'ho sostituito con " -u nomeserver 2 " e funziona egregiamente, dunque visto che -u è un parametro documentato nell'help di fping, ne deduco che ${servers[@]} venga tradotto al volo in una lista di server... Hai dichiarato un array nello script stesso te? Che c'entra quel 2 alla fine?

    E giusto per concludere in bellezza, perchè gli fai fare un salto in /dev/null prima di arrivare a server_down.txt?


  9. #9
    Utente di HTML.it L'avatar di untamed
    Registrato dal
    Sep 2004
    Messaggi
    831
    "${servers[@]}" rappresenta tutti gli elementi di un array in cui ho messo i server da verificare.
    "2>/dev/null" ridirige gli errori su /dev/null invece che sullo standard output.
    "La fede in una missione divina è una delle tante forme di certezza che hanno afflitto la razza umana." - Bertrand Russell

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2020 vBulletin Solutions, Inc. All rights reserved.