Envio de comando CISCO publipostadas via SSH/Telnet

Dezembro 2016

Envio de comando CISCO publipostadas via SSH/Telnet


Informações gerais

  • Nome do script : publip.sh
  • Flexibilidade : quase totalidade :
  • restrições : 1 só, é preciso que a senha seja a mesma para todos os equipamentos, senão é preciso adicionar algumas linhas de código...
  • Criticidade : elevada , é preciso ter muito cuidado com os comandos entradas , você pode gelar sua rede inteira se você não souber aquilo que você faz!
  • Conhecimento conhecido no Linux : Você sabe editar um arquivo, colocar lindas coisas dentro, o Linux registra e fecha, (ees, depois :wq <entre> ? Você sabe executar um script shell pelo comando ital>./nome_script</ital> na pasta onde ele se encontra? Não? Bom, agora, sim! Nenhum conhecimento é exigido para utilizar este script.


==publipmachin ponto cheu ? Mas o que é na verdade ?

Este script permite para um administrador de rede, digitar linhas de comando CISCO, publipostadas sobre um número de equipamentos distantes escolhidos roteador, firewall, switch], Ponto de acesso Wifi...), isto em SSH], ou em Telnet (o script gera dois tipos de conexão) e automaticamente.

Estas linhas de comando serão em primeiro lugar digitadas depois, um comando por linha como um batch, ou um arquivo de configuração, no pequeno arquivo nomeado comandos .txt (não tem nenhum limite de tamanho).

Em seguida, será preciso digitar todos os IP (ou alias DNS), dos equipamentos onde você quer que os comandos sejam digitados (não tem nenhum limite para o número de equipamentos).

Enfim, você executa o script e lá, será preciso ter muito cuidado para não se enganar quando o script lhe solicitará de digitar sua senha, que eu lembro você deve ser imperativamente o mesmo para todos os equipamentos.

Mas là onde isto vai se tornar interessante, é que este script vai muito mais longe !
Com efeito, ele suporta e isto de maneira total os erros de conexão, e a digitação, para entrá-los em seguida em um arquivo log. Este script identifica igualmente o equipamento pelo o qual ele consegui se conectar em SSH, ou em telnet, e enfim ele conserva um arquivo dos procedimentos de entradas digitadas que geraram erros críticos (bloqueios do script, erro de interpretação de um comando pelo equipamento). Os diferentes tipos de erros suportados:
  • 1 - Conexão em timeout
  • 2 - Erro de log-in, ou senha
  • 3 - Alias DNS ou IP inexistente
  • 4 - Bloqueio do script Expect (criação do arquivo log do equipamento)
  • 5 - Conexão à distância desativada
  • 6 - Alias DNS correto mas associado a um IP que não existe (no route to host)
  • 7 - Equipamento não Cisco (HP Procurve)
  • 8 - Equipamento não Cisco (X1000)
  • 9 - Equipamento Cisco (Alcatel)
  • 10 - Comando publipostado não reconhecido pelo equipamento (criação de arquivo log de equipamento)
  • 11 - Erro não classificado ($? = 1)


Você poderá além domais operar todos os seus equipamentos ao mesmo tempo, recolher informações preciosas sobre sua rede. Isto não é maravilhoso !

O conteúdo dos arquivos anexos

Comandos.txt


Você deverá absolutamente digitar os comandos depois... O arquivo deve para qualquer modificação da configuração do roteador começar "conf t" e terminar "end". Não se esqueça de proceder de maneira hierárquica, pra não entrar comandos lá onde não pode... e sobretudo... não se esqueça de registrar suas modificações§ Por exemplo :

#comandos.txt 

conf t 
 router ospf 100 
  network 50.50.100.0 0.0.0.255 area 0 
 exit 
 interface fa0/0 
  ip ospf hello-interval 5 
  ip ospf dead-interval 20 
 exit 
 area 0 authentication message-digest 
end 
write mem 

liste.txt


Uma brincadeira de criança ! Entre somente os IP, ou os aliás DNS, dos equipamentos que lhe concernem, e pronto ! Um equipamento por linha... Outro pequeno exemplo :

# liste.txt 

10.25.85.46 
roteador-marseille 

switch-assembléia-geral 
80.54.136.105 


Eu deixei voluntariamente um espaço, para lhe mostrar que o script não suporta os espaços.

THE Script


O script será legendado por pequenos #[1], que serão comentados abaixo no script
#!/bin/bash 
#script.sh 

echo "queira dar a senha " 
stty -echo                                                                       #[1] 
read password 
stty echo 

export ssh='./ssh.sh'                                                            #[2] 
export telnet='./telnet.sh' 
export erro='./relatório_erro.log' 
export temp='./tmp_roteador.log' 
export cmdcisco='./comandos.txt' 
export lista='./lista.txt' 
export senha
export roteador 
export comando 

rm -f $erro                                                                    #[3] 
rm -f $ssh 
rm -f $telnet 

cat $liste | while read roteador; 
do 
        if [ "$roteador" != "" ] 
        then 
                if[ ! -f $ssh ]                                                  #[4] 
                then 
                        echo 'expect 2>&1 << EOF'>> $ssh 
                        echo 'spawn ssh admin@$roteador' >> $ssh 
                        echo 'expect {' >> $ssh 
                        echo '"Password:" {send "$password\r"}' >> $ssh 
                        echo 'timeout {exit}' >> $ssh 
                        echo '        }' >> $ssh 
                        echo 'expect "#"' >> $ssh 

                        cat $cmdcisco | while read commande 
                        do 
                                echo "send \"$commande\r\"" 
                                echo 'expect "#"' 
                        done >> $ssh 

                        echo 'send "exit\r"' >> $ssh 
                        echo 'expect "closed"' >> $ssh 
                        echo 'exit' >> $ssh 
                        echo 'EOF' >> $ssh 

                        chmod +x $ssh                                            #[5] 
                fi 
                time -p $ssh > $temp 2>&1                                        #[6] 

                COD_RET=$? 

                auth='cat $temp | grep -c "Password: "'                          #[7] 
                if [ "$auth" -gt "1" ] 
                then 
                        echo "Problema de autenticação no $roteador !" 
                        echo "$roteador : wrong log-in/password" >> $erro 
                        continua 
                fi 

                temps='grep 'real ' $temp | sed 's/real /§/' | cut -d'§' -f2 | cut -d' ' -f1 | cut -d'.' -f1' 
                if [ $temps -ge 10 -a ! "'grep 'closed' $temp'" ]                #[8] 
                then 
                        echo "O equipamento $roteador não responde!"; 
                        echo "$roteador : connection timed out"  >> $erro 
                        continua 
                fi 

                if [ "$COD_RET" != "0" ]                                          #[9] 
                then 
                        #Erro de conexão no equipamento em SSH 
                        if [ ! -f $telnet ] 
                        then 
                                echo 'expect 2>&1 << EOF'>> $telnet 
                                echo 'spawn telnet $roteador' >> $telnet 
                                echo 'send "admin\r"' >> $telnet 
                                echo 'expect "Password:"' >> $telnet 
                                echo 'send "$password\r"' >> $telnet 
                                echo 'expect "#"' >> $telnet 

                                cat $cmdcisco | while read commando 
                                do 
                                        echo "send \"$comando\r\"" 
                                        echo 'expect "#"' 
                                done >> $telnet 

                                echo 'send "exit\r"' >> $telnet 
                                echo 'expect "closed"' >> $telnet 
                                echo 'exit' >> $telnet 
                                echo 'EOF' >> $telnet 

                                chmod +x $telnet 
                        fi 
                        $telnet > $temp 2>&1 
                fi 
                COD_RET=$? 

                auth='cat $temp | grep -c "Password: "'                          #[10] 
                if [ "$auth" -gt "1" ] 
                then 
                        echo " Problema de atenticação no $roteador!" 
                        echo "$roteador : wrong log-in/password" >> $erro 
                elif [ "'grep 'Host name lookup failure' $temp'"  ] 
                then 
                        echo "o equipamento  $roteador não existe!" 
                        echo "$roteador : does not exist"  >> $erro 
                elif [ "'grep 'Unknown host' $temp'" ] 
                then 
                        echo "la saisie de l'ip ou du nom $roteador est incorrecte !" 
                        echo "$roteador : wrong spelling" >> $erro 
                elif [ "'grep 'send: spawn id exp4 not open' $temp'" ] 
                then 
                        echo "/!\ ERRO no precedimento. Consulte log de $roteador !!!" 
                        echo "$roteador : Expect script execução!" >> $erro 
                        cp $temp $roteador.error.log 
                elif [ "'grep 'Authentication failed' $temp'" ] 
                then 
                        echo "Mot de passe erroné pour $roteador !" 
                        echo "$roteador : wrong log-in/password" >> $erro 
                elif [ "'grep 'Connection refused' $temp'" ] 
                then 
                        echo "Connexão à distância no $roteador desativado !" 
                        echo "$roteador : vty connection disabled" >> $erro 
                elif [ "'grep 'No route to host' $temp'" ] 
                then 
                        echo "Alias DNS $roteador existente mas IP invalido !" 
                        echo "$roteador : No route to host" >> $erro 
                elif [ "'grep 'ProCurve' $temp'" ] 
                then 
                        echo "roteador $roteador HP e não Cisco !" 
                        echo "$roteador : non Cisco router (HP ProCurve)" >> $erro 
                elif [ "'grep 'Alcatel' $temp'" ] 
                then 
                        echo "roteador $roteador Alcatel e não Cisco !" 
                        echo "$roteador : não Cisco roteador  (Alcatel)" >> $erro 
                elif [ "'grep 'Welcome to X1000' $temp'" ] 
                then 
                        echo "roteador $roteador X1000 e não Cisco !" 
                        echo "$roteador : não Cisco equipement (X1000)" >> $erro 
                elif [ "'grep '% Unknown command' $temp'" -o "'grep '% Invalid' $temp'" ] 
                then 
                        echo "/!\ Comandos Cisco não reconhecidos pelo equipamento. Consulte o arquivo log de $roteador !!!" 
                        echo "$roteador : Unrecognized commands found" >> $erro 
                        cp $temp $roteador.error.log 
                elif [ "'grep 'Connected to ' $temp'" -o "'grep 'Connection closed by foreign host.' $temp'" ] 
                then 
                        echo "$roteador Telnet OK !" 
                elif [ "'grep 'Conexão registrada no terminal $temp'" -o "'grep 'Connection to ' $temp'" ] 
                then 
                        echo "$roteador SSH OK !" 
                elif [ "$COD_RET" != "0" ] 
                then 
                        echo "Problema de conexão ao equipamento  $roteador !" 
                        echo "$roteador : connection problem" >> $erro 
                fi 
        fi 
done 
rm -f $temp                                                                      #[11] 
exit 

Comentários

  • 1 : Esconde-se a digitação da senha
  • 2 : Todos os arquivos são estocados nas variantes em caminho relativo, para que o script possa ser executado de qualquer lugar
  • 3 : Suprime-se os arquivos gerados e existentes se o script já foi executado
  • 4 : Gera-se o arquivo Expect se isto já não foi feito, entrando o procedimento de conexão SSH bem como os comandos provenientes de comandos .
  • 5 : Atribui-se os direitos de execução ao script Expect gerados, se quisermos que ele seja executado corretamente
  • 6 : Executa-se o script expect, agrupando a saída de erro, calculando a saída standard, calculando o tempo de execução para gerar o timeout, e colocando tudo em um arquivo temp.
  • 7 : Verifica-se que tem um problema de autenticação contando o número de ocorrência "Password:" no arquivo temp
  • 8 : Recupera-se o número do tempo de execução, e se verifica que ele não seja superior a 10 (valor do timeout do expect)
  • 9 : Em caso erro de conexão em SSH, refaz-se o procedimento em Telnet
  • 10 : Gera-se todos os casos de erro suportados pelo script. (c.f. II)
  • 11 : Suprime-se o arquivo temp, que torna-se inútil




Tradução feita por Ana

Veja também :
Este documento, intitulado « Envio de comando CISCO publipostadas via SSH/Telnet »a partir de CCM (br.ccm.net) está disponibilizado sob a licença Creative Commons. Você pode copiar, modificar cópias desta página, nas condições estipuladas pela licença, como esta nota aparece claramente.