Pular para o conteúdo

ison - testar conectividade da máquina

Script para testar conectividade da máquina, usando a ferramenta ping, nos vários pontos da rede, apontando se for o caso em que ponto da rede está o problema da conexão. O procedimento usado pelo script é:

1. ping na loopback
2. ping no gateway
3. ping em um número ip na internet
4. ping em um nome de domínio na internet

Lógica do script:

1. se chega na loopback, então TCP/IP da máquina à partida está OK
2. se chega no gateway, então conexão com gateway está OK
3. se chega na internet usando ip, então tem conexão com Internet
4. se chega na internet usando nome de domínio, então resolução de nomes está OK.

Script testa apenas se tem ou não conexão. Não testa questões de largura de banda nem perdas de pacotes nem problemas de rota etc.
Pedro Fernandes sabe nada
Hits: 8.250 Categoria: Shell Script Subcategoria: Miscelânea
  • Download
  • Nova versão
  • Indicar
  • Denunciar
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Descrição

Script para testar conectividade da máquina, usando a ferramenta ping, nos vários pontos da rede, apontando se for o caso em que ponto da rede está o problema da conexão. O procedimento usado pelo script é:

1. ping na loopback
2. ping no gateway
3. ping em um número ip na internet
4. ping em um nome de domínio na internet

Lógica do script:

1. se chega na loopback, então TCP/IP da máquina à partida está OK
2. se chega no gateway, então conexão com gateway está OK
3. se chega na internet usando ip, então tem conexão com Internet
4. se chega na internet usando nome de domínio, então resolução de nomes está OK.

Script testa apenas se tem ou não conexão. Não testa questões de largura de banda nem perdas de pacotes nem problemas de rota etc.
Download ison Enviar nova versão
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Versões atualizadas deste script

Esconder código-fonte

#!/bin/bash
#
############################################################
#
# Script: ison
# Autor:  pedro fernandes
# Email:  pedrobfernandes37@gmail.com
# Data:   30-04-2021
#
# -------------------------------------------------------
#
# Descrição: Testa conectividade da máquina usando o ping
#            nos vários pontos da rede, apontando se for
#            o caso em que ponto da rede está o possível
#            problema na conexão.
#
#            Procedimento:
#
#            1. ping loopback
#            2. ping gateway
#            3. ping ip na internet
#            4. ping nome de domínio na internet
#
# ------------------------------------------------------
#
# Nota: Variáveis DnsAddr e DomainTest, estão configuradas
#       para o dns da cloudfare e url google por padrão.
#       Para usar outros valores basta definir-los na
#       linha de comando na chamada do script (ver abaixo).
#       Da mesma forma, variável TimeOut refere-se
#       ao parâmetro -w (deadline) do ping e está
#       configurada por padrão para 5 segundos.
#       Para mudar, novamente ver abaixo nos exemplos de uso.
#
# -------------------------------------------------------
#
# Alguns exemplos de Uso:
#
# 1. Usa valores padrão
#
#  $ ./ison
#
# 2. Muda os valores do dns e do dominio
#
#  $ DnsAddr=x.x.x.x DomainTest=www.xxxx.xxx.com ./ison
#
# 3. Muda valor apenas do dns
#
#  $ DnsAddr=x.x.x.x ./ison
#
# 4. Muda apenas o dominio
#
#  $ DomainTest=www.xxx.xxx.com ./ison
#
# 5. Especificar um deadline diferente
#
#  $ TimeOut=x ./ison
#
# Pode mudar todos os parâmetros:
#
#  $ DnsAddr=x.x.x.x DomainTest=www.xxxxx.xxx.com TImeOut=x ./ison
#
############################################################
#
##### PARÂMETROS
#
Ping=$(type -p ping)
TimeOut=${TimeOut:- 5}
Ip=$(type -p ip)
Route=$(type -p route)
LoopBack=127.0.0.1
DnsAddr=${DnsAddr:-1.1.1.1}
DomainTest=${DomainTest:-'www.google.com'}
#
############################################################
#
##### FUNÇÕES
#
function MissingMsg {
    #
    if [ $# -eq 1 ]
    then
        echo Você não tem utilitário $1 instalado >&2
        echo Nesse caso não podemos prosseguir. >&2
        echo Terminando script... >&2
        exit 1
    #
    elif [ $# -eq 2 ]
    then
        echo Você não tem utilitário $1 'e|ou' $2 instalado >&2
        echo Nesse caso não podemos prosseguir. >&2
        echo Terminando script.... >&2
        exit 1
    fi
}
#
function UserIntro {
    #
echo '
*************************************************

O script ison, testa a conectividade da máquina,
usando a ferramenta ping para enviar pacotes de
requisição de echo para vários pontos da rede em
ordem.

O procedimento usado pelo script é:

1. Testa a interface de loopback. Se der certo
   TCP/IP da máquina está funcionando.

2. Testa a conexão da máquina com o gateway.
   Se der certo, tem comunicação com gateway.

3. Testa a conectividade com 1 host na internet
   usando o endereço ip. Se der certo, consegue
   alcançar internet.

4. Testa a conectividade com 1 host na internet
   usando o nome de dominio. Se der certo resolução
   de nomes está funcionando.

NOTA: Script NÃO testa problemas de largura de banda
      nem problemas de rotas ou perdas de pacotes.
      Testa apenas se tem conexão e caso não tenha
      em que ponto da rede não tem a conexão.

*************************************************'
#
echo -e "Continuar para o script [S/n] ? \c"
read -n 1 answer
#
case $answer in
S | s)
    echo -e "\nProsseguindo...."
    return
    ;;
N | n)
    echo -e "\nTerminando..."
    exit 0
    ;;
*)
    echo -e "\nInválido. Terminando..." >&2
    exit 1
    ;;
esac

}
#
function IsUp {
    #
    $Ping -q -w $TimeOut $1
    case $? in
    0)
        if [ -n "$line2" ]
        then
            echo
            echo '#####################################'
            echo -e "\n$line1"
            echo -e "$line2\n"
            echo '#####################################'
            echo
            sleep 2
        else
            echo
            echo '#####################################'
            echo -e "\n$line1\n"
            echo '#####################################'
            echo
            sleep 2
        fi
        ;;
    *)
        if [ -n "$error2" ]
        then
            echo
            echo '#####################################'
            echo -e "\n$error1" >&2
            echo -e "$error2\n" >&2
            echo '#####################################'
            echo
            exit 1
        else
            echo
            echo '#####################################'
            echo -e "\n$error1\n" >&2
            echo '#####################################'
            echo
            exit 1
        fi
        ;;
    esac
    unset line1
    unset line2
    unset error1
    unset error2
    return
}
#
############################################################
#
###### VERFICAÇÕES
#
if [ -z "$Ping" ]
then
    MissingMsg ping
fi
#
if [ -n "$Ip" ]
then
    Gateway=$($Ip route | head -1 | cut -d ' ' -f 3)
#
elif [ -n "$Route" ]
then
    Gateway=$($Route -n | head -3 | tail -1 | \
    gawk '{print $2}')
else
    MissingMsg ip route
fi
#
###########################################################
#
##### INTRO OU NÃO?
#
echo -e "Ver introdução ao script [S/n] ? \c"
read -n 1 answer
#
case $answer in
S |s)
    clear
    UserIntro
    ;;
N |n)
    clear
    :
    ;;
*)
    echo -e "\nInválido. Terminando...." >&2
    exit 1
    ;;
 esac
#
###########################################################
#
##### LOOPBACK
#
line1='Tem conectividade com loopback'
error1='Não conseguimos alcançar loopback'
#
clear
echo -e 'Testando sua interface de loopback\n'
IsUp "$LoopBack"
#
############################################################
#
##### GATEWAY
#
echo -e 'Testando conexão com o gateway....\n'
line1='Tem conexão com o gateway'
error1='Não conseguimos alcançar o gateway'
IsUp "$Gateway"
#
############################################################
#
##### CONEXÃO INTERNET (IP)
#
clear
echo -e 'Testando conectividade para a internet....\n'
echo Primeiro testando por número ip....
#
line1='Estamos conseguindo alcançar a internet'
line2='através do endereço ip.'
error1='Erro ao tentar conectar na internet'
error2='através do endereço ip.'
IsUp "$DnsAddr"
#
############################################################
#
##### CONEXÃO INTERNET (DOMÍNIO)
#
echo Tentando agora alcançar através de
echo -e 'nome de dominio.....\n'
#
line1='Consegimos alcançar dominio na internet.'
error1='Não conseguimos alcançar dominio na internet.'
IsUp "$DomainTest"
#
echo Todos os teste foram concluídos
exit 0
#
############################################################
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Buscador e tocador de mp3

Font Installer v1.0 - Instalação de Fontes no Sistema

Backup de algumas databases, Remotamente.

Menu_Funcional dialog

Gerenciador de Conexões terminal server com Mysql

#2 Comentário enviado por sabe nada em 16/05/2021 - 13:29h

[1] Comentário enviado por mauricio123 em 13/05/2021 - 20:49h


Bem completo.

___________________________________________________________
Conhecimento não se Leva para o Túmulo.
https://github.com/MauricioFerrari-NovaTrento



Sim. Eu fiz porque a minha net aqui de casa estava caindo a toda a hora, e eu andava feito barata tonta olhando luzes de roteador e placa de rede e enviando ping para aqui e para ali; para ver se era aqui em casa ou o provedor kk. Então parei e pensei... ué!! fazer um script!! kk
#3 Comentário enviado por msoliver em 01/12/2021 - 00:56h
Muito boa a iniciativa e a idealização,
Mas, pode melhorar em alguns pontos:

Não é necessário atribuir valores para as 'vars', dessa forma.....
TimeOut=${TimeOut:- 5}
DnsAddr=${DnsAddr:-1.1.1.1}
DomainTest=${DomainTest:-'www.google.com'}
-------------------------------------------------------------
Quando possível, evite "pipes" em excesso:
Gateway=$($Ip route | head -1 | cut -d ' ' -f 3)
awk '/^default/{print $3}' <<< $(ip route)
-------------------------------------------------------------
$Route -n | head -3 | tail -1 | gawk '{print $2}'
awk '$4=="UG" {print $2}' <<< $(route)
Obs.:
U =» (route is up)
G =» (use gateway)
-------------------------------------------------
Otimizando:
type -t ip &>/dev/null && { gw=$(awk '/^default/{print $3}' <<< $(ip r));} || gw=$(awk '$4=="UG" {print $2}' <<< $(sudo route))
-------------------------------------------------
Para comandos "repetitivos", use um laço:
Exemplo:
As chamadas para o ping, estão em um laço.
Se não tem GW, não tem Rede, interrompe.
Só vai "pingar" no LoopBack.
-------------------------------------------------
#!/usr/bin/env bash

printf '\x1bc'; #Limpa a tela
gc="\e[1;32m";rc="\e[1;38m";fc="\e[m"; #cores
TimeOut='5';
gw=$(awk '/^default/{print $3}' <<< $(ip r));
alvos=(127.0.0.1 ${gw} 8.8.8.8 google.com.br);
ttl=(Loopback Gateway IP Domínio);
linha=$(echo -e $_{1..26}'\b&#9472;·');
act=0;err=0;

[ -z "$gw" ] && { printf "\n\n${rc}${linha}\n%14s*** Sem Conexão ***\n${linha}\n${fc}\n\n";exit 0;}

for X in {0..3};do n=$((X+1))
echo -e "[$n] Testes de Conectividade: ${ttl[$X]} em: ${alvos[$X]}:"
if ping -w $TimeOut ${alvos[$X]} &>/dev/null;then
let act++;
printf "${linha}\n${gc}%18s*** Sucesso ***${fc}\n${linha}\n\n"
else
printf "${linha}\n${rc}%18s**** falha ****${fc}\n${linha}\n\n"
let err++;
fi
wait;
done

pac=$(bc <<< "scale=2;($act/4)*100")%;
per=$(bc <<< "scale=2;($err/4)*100")%;
echo -e "\n${linha}\nTeste concluído.\nAcertos: $pac\nErros: $per\n${linha}\n";
---------------------------------------------------------------------------------------------------------------

______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________
#4 Comentário enviado por sabe nada em 02/12/2021 - 17:04h

[3] Comentário enviado por msoliver em 01/12/2021 - 00:56h

Muito boa a iniciativa e a idealização,
Mas, pode melhorar em alguns pontos:

Não é necessário atribuir valores para as 'vars', dessa forma.....
TimeOut=${TimeOut:- 5}
DnsAddr=${DnsAddr:-1.1.1.1}
DomainTest=${DomainTest:-'www.google.com'}
-------------------------------------------------------------
Quando possível, evite "pipes" em excesso:
Gateway=$($Ip route | head -1 | cut -d ' ' -f 3)
awk '/^default/{print $3}' &lt;&lt;&lt; $(ip route)
-------------------------------------------------------------
$Route -n | head -3 | tail -1 | gawk '{print $2}'
awk '$4=="UG" {print $2}' &lt;&lt;&lt; $(route)
Obs.:
U =» (route is up)
G =» (use gateway)
-------------------------------------------------
Otimizando:
type -t ip &amp;&gt;/dev/null &amp;&amp; { gw=$(awk '/^default/{print $3}' &lt;&lt;&lt; $(ip r));} || gw=$(awk '$4=="UG" {print $2}' &lt;&lt;&lt; $(sudo route))
-------------------------------------------------
Para comandos "repetitivos", use um laço:
Exemplo:
As chamadas para o ping, estão em um laço.
Se não tem GW, não tem Rede, interrompe.
Só vai "pingar" no LoopBack.
-------------------------------------------------
#!/usr/bin/env bash

printf '\x1bc'; #Limpa a tela
gc="\e[1;32m";rc="\e[1;38m";fc="\e[m"; #cores
TimeOut='5';
gw=$(awk '/^default/{print $3}' &lt;&lt;&lt; $(ip r));
alvos=(127.0.0.1 ${gw} 8.8.8.8 google.com.br);
ttl=(Loopback Gateway IP Domínio);
linha=$(echo -e $_{1..26}'\b&amp;#9472;·');
act=0;err=0;

[ -z "$gw" ] &amp;&amp; { printf "\n\n${rc}${linha}\n%14s*** Sem Conexão ***\n${linha}\n${fc}\n\n";exit 0;}

for X in {0..3};do n=$((X+1))
echo -e "[$n] Testes de Conectividade: ${ttl[$X]} em: ${alvos[$X]}:"
if ping -w $TimeOut ${alvos[$X]} &amp;&gt;/dev/null;then
let act++;
printf "${linha}\n${gc}%18s*** Sucesso ***${fc}\n${linha}\n\n"
else
printf "${linha}\n${rc}%18s**** falha ****${fc}\n${linha}\n\n"
let err++;
fi
wait;
done

pac=$(bc &lt;&lt;&lt; "scale=2;($act/4)*100")%;
per=$(bc &lt;&lt;&lt; "scale=2;($err/4)*100")%;
echo -e "\n${linha}\nTeste concluído.\nAcertos: $pac\nErros: $per\n${linha}\n";
---------------------------------------------------------------------------------------------------------------

______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________



Muito obrigado pelas dicas Mestre Paladino das Artes Computacionais.
Irei fazer algumas mudanças com base nas suas dicas e atualizar meu script lá no meu GitHub.

Ficou mais ou menos assim meu script:

#!/bin/bash
#
########################################################################
#
TimeOut=${TimeOut:- 5}
Gateway=$(gawk '/^default/{print $3}' <<<$(ip r))
DnsAddr=${DnsAddr:-8.8.8.8}
DomainTest=${DomainTest:-'www.google.com'}
Targets="127.0.0.1 ${Gateway} ${DnsAddr} ${DomainTest}"
Success=0
Failure=0
#
#########################################################################
#
[ -z "$Gateway" ] && {

echo -e "\n\n*** Sem Conexão ***\n\n"
exit 0

}

for Target in $Targets
do
echo -e "Teste de Conectividade em: $Target"
#
if ping -w $TimeOut $Target &> /dev/null
then
Success=$(( Success + 1 ))
echo -e "\n\n*** Sucesso ***\n\n"
else
echo -e "\n\n*** Falha ***\n\n"
Failure=$(( Failure + 1 ))
fi
#
wait
done
#
################################################################################
#
Hit=$(bc <<< "scale=2; ($Success / 4) * 100")%;
Miss=$(bc <<< "scale=2; ($Failure / 4) * 100")%;

echo -e "\n\nTeste Concluído.\nAcertos: $Hit\nErros: $Miss\n"

exit 0
#
################################################################################

O primeiro ponto (as variáveis), deixo assim de propósito, pois quero puder chamar o script com outros Dns e dominios e timeouts sem ter que mudar dentro do script.

Você usou arrays correto? Em alvos e ttl. Possivelmente deve ser mesmo mais eficiente, mas sempre que leio um livro sobre shell dizem me para evitar arrays no shell como se fosse a nova onda do COVID!!
Então prefiro (mesmo que seja mais custoso) usar: Targets="127.0.0.1 ${Gateway} ${DnsAddr} ${DomainTest}" e depois: for Target in $Targets....
Na verdade não sei porque esse medo de arrays, eu aprendi agora em C e é da hora kkkk! Mas não tenho paciência para procurar explicações kkk!!

Contribuir com comentário

Entre na sua conta para comentar.