Preciso criar uma forma no linux ( red hat ) de testar conectividade icmp em vários IPs.
Esses IPs eu tiro de um inventário que é gerado em excel onde eu tenho o hostname do elemento ( coluna A ) e o IP ( coluna B ).
A minha idéia é que o comando consulte essa planilha e faça o seguinte:
Ping o primeiro IP e teste a conectividade. Se o teste não for satisfatório preencher a coluna C como "Equipamento Inoperante". Se o teste for satisfatório pingar novamente com o tamanho do pacote em 9216 bytes. Se tiver resposta, informar na coluna D "Equipamento operante - SNMP OK", senão "Equipamento operante - SNMP NOK".
Fico no aguardo de um retorno positivo.
Boa noite Rafael.
Ao meu ver, o modo mais pratico é salvar essa planilha em ".csv".
Feito isso, é simples....
Faça um "laço" com o while, "pegue" o ip de cada linha e execute o ping...
Exemplo: OBS: O separador de campo (IFS), neste caso, é ":" (sem as aspas)
#!/bin/bash
while IFS=":" read hostname ip;do
if (($(ping -c4 $ip|grep -c 'time') >= 2));then
if (($(ping -c4 -s9216 $ip|grep -c 'time') >= 2));then
echo $hostname:$ip:Equipamento operante:SNMP OK >> resultado.csv
else
echo $hostname:$ip:Equipamento operante:SNMP NOK >> resultado.csv
fi
else
echo $hostname:$ip:Equipamento Inoperante >> resultado.csv
fi
done<testes.csv
Marcelo Oliver
Marcelo,
Obrigo pela resposta célere!
Pouco conheço de Linux e muito menos programação. rsrsrs
Esqueci de comentar que o linux está num servidor remoto.
Eu acesso via SSH e dele pingo os elementos que serão testados.
Se você puder fazer um passo-a-passo ficarei grato.
Tipo...
1) Esse código eu devo criar um arquivo com uma extensão específica?
2) O arquivo resultado.csv ficará na mesma pasta que o arquivo que está o código?
3) Essa programação que você criou testará todos os IPs que estiver na minha planilha e preencherá a mesma?
Desculpe pelas perguntas!
Desde já agradeço.
Boa tarde Rafael, vamos as respostas: 1) Não é necessário, mas por questões de organização, sempre uso a extensão "sh" de Shell Script. 2) Sim. 3) Testará todos que estiverem no "ARQUIVO.csv", e será gerado o arquivo "resultado.csv", que abre com o excell.
Passo a Passo:
Conecte no servidor.
Abra um editor de textos, cole o código que criei,
Salve com o nome, Testes_Rede.sh,
Abra um terminal, na mesma pasta onde salvou o "Testes_Rede.sh", e execute o comando:
chmod +x Testes_Rede.sh
Isso é para dar permissão de execução ao script.
Abra a planilha com os "IP's", e salve como ".csv", use o ":" (dois pontos), como separador de campo.
Observe que no script, tal arquivo tem o nome "testes.csv" (ultima linha do código)
Abra o arquivo.csv e certifique-se que existe um ip por linha.... E, os campos separados por ":"
Agora é só executar o "script", com o comando:
./Testes_Rede.sh
OBS: o arquivo "testes.csv" deve ficar na mesma pasta do Script.
Att.:
Marcelo Oliver
Fala aí Marcelo beleza?
Vamos lá...
Escolhi o nome do arquivo que terá o script e será teste_snmp.sh Sem problemas, batize com o nome que quizer...
O arquivo que será gerado pelo inventário será o teste_snmp.csv. Esse arquivo que será consultado pelo Script? O código que fiz, vai consultar onde estão os IP's e gravar o resultado em resultado.csv.
O arquivo que é gerado pelo inventário, a primeira linha tem as descriptions ( Site Name,Site ID,Resync Status ). Não!
O script que você criou buscará os IPs de forma correta? Não vou responder!
No seu passo-a-passo estou com dúvidas:
"Abra um editor de textos, cole o código que criei"
Esse servidor que eu uso é só linha de comando, não tem GUI. Tem como eu chamar o editor via CLI, colar o script e salvar? Poderia me explicar como faz? Para abrir um editor de textos não é necessário ter o modo gráfico... Use o nano, ou outro em modo texto
"Abra a planilha com os "IP's", e salve como ".csv", use o ":" (dois pontos), como separador de campo"
O separador de campo no arquivo gerado pelo inventário é ",". Terei que mudar no script ou substituo a "," por ":" ( sem aspas )? Ou altera o script... Ou o ".csv"
"Observe que no script, tal arquivo tem o nome "testes.csv" (ultima linha do código)"
No final do script mudo para o nome do arquivo que escolhi ( teste_snmp.csv )? Sim!
No script terei que mudar hostname por Site Name e ip por Site ID? Nao entendi a necessidade dessa alteração!!!!
Vou mudar o arquivo resultado.csv para resultado_teste_snmp.csv. Terei que mudar no script né? Obvio!
Quando ele for gerado depois dos testes, ficará separado em colunas ou eu terei que depois editar o mesmo? Observe a saída do script (comando "echo"),
Note que existem quatro campos....
Muito obrigado mais uma vez.
Teste e veja o resultado, não existe mágica, é pura lógica.
Te passei a "receita"....
Adapte para os nomes, separadores, etc... Que deseja usar
Marcelo Oliver
Marcelo,
Bom dia.
Adaptei o script.
#!/bin/bash
while IFS=, read hostname ip;do
if (($(ping -c4 $ip|grep -c 'time') >= 2));then
if (($(ping -c4 -s9216 $ip|grep -c 'time') >= 2));then
echo $hostname:$ip:Equipamento operante:SNMP OK >> resultado_teste_snmp.csv
else
echo $hostname:$ip:Equipamento operante:SNMP NOK >> resultado_teste_snmp.csv
fi
else
echo $hostname:$ip:Equipamento Inoperante >> resultado_teste_snmp.csv
fi
done<teste_snmp.csv
O único local do script que tenho que trocar o ":" pela "," é depois do IFS= né?
O script que você criou buscará os IPs de forma correta? Não vou responder!
Eu te fiz essa pergunta não duvidando do seu script, mas sim porque a primeira linha do inventário que eu tiro do sistema tem Site Name,Site ID,Resync Status e pensei que poderia atrapalhar!!!
Poderia validar o script?
Você trabalha com desenvolvimento/programação? Está empregado?
Best Regards,
Rafael Baptista
Bom dia Rafael,
Desculpe da resposta "atravessada", não observei a existência do cabeçalho...
Nesse caso é necessário uma alteração...
Segue:
#!/bin/bash
while IFS="," read hostname ip;do let count++
(($count>1)) && {
if (($(ping -c4 $ip|grep -c 'time') >= 2));then
if (($(ping -c1 -s9216 $ip|grep -c 'time') == 1));then
echo $hostname:$ip:Equipamento operante:SNMP OK >> resultado_teste_snmp.csv
else
echo $hostname:$ip:Equipamento operante:SNMP NOK >> resultado_teste_snmp.csv
fi
else
echo $hostname:$ip:Equipamento Inoperante >> resultado_teste_snmp.csv
fi
} || echo "Site Name:Site ID:Resync:Status" > resultado_teste_snmp.csv
done<teste_snmp.csv
Testei aqui e obtive o seguinte resultado:
Site Name:Site ID:Resync:Status
uol.com.br:200.147.67.142:Equipamento operante:SNMP NOK
router:192.168.0.1:Equipamento operante:SNMP OK
terra.com.br:208.84.244.116:Equipamento operante:SNMP NOK
OBS: Agora insere o cabeçalho no arquivo gerado.
Atualmente estou desempregado...
Att.:
marcelo oliver
Opa...
Você é formado? Como pode me passar seu currículo?
Voltando ao assunto. Acho que ainda precisamos ajustar...
Quando eu tiro o inventário o cabeçalho fica da seguinte forma: Site Name,Site ID,Resync Status
Mas quando o teste for concluído, não vou precisar da coluna Resync Status e sim Status do equipamento. Mudo no script o Resync:Status por Status do equipamento?
Dúvida: O que significa as linhas abaixo?
Eu imagino o que seja, mas com sua explicação, de repente terei que mudar também.
if (($(ping -c4 $ip|grep -c 'time') >= 2));then
if (($(ping -c1 -s9216 $ip|grep -c 'time') == 1));then
Best Regards,
Rafael Baptista
Rafael, a minha formação é de técnico em eletrônica, em 1983 . . .
Aprendi a programar como autodidata....
Altere a linha do cabeçalho no script, é a penúltima . . . if (($(ping -c4 $ip|grep -c 'time') >= 2));then
Traduzindo:
Se o resultado de "ping -c4 $ip|grep -c 'time'" for maior ou igual a dois:
É verdadeiro
Senão, é falso if (($(ping -c1 -s9216 $ip|grep -c 'time') == 1));then
Se o resultado de "ping -c1 -s9216 $ip|grep -c 'time'" for igual a 1:
É verdadeiro.... Senão, é falso
marcelo oliver[/quote]
Maravilha...
No meu cenário acho melhor testar o segundo ping igual o primeiro. De repente por uma indisponibilidade na rede o primeiro ping pode falhar!!!
Outro coisa... Depois do IFS, a vírgula fica entre aspas?
Você tem Telegram? Tenho contato com empresas de desenvolvimento!!!