Usando expect pra acessar um host no meio do caminho

Categoria: Scripts Publicado: Sexta, 11 Junho 2021 Escrito por Helio Loureiro

Eu estou no momento trabalhando num troubleshooting de uma rede 5G.  Qual a novidade?  Seria o 5G?  Bom... não.  A diferença é que pra acessar o ambiente cloud eu preciso fazer login numa máquina e depois fazer login em outra máquina.

Nada muito glamouroso, mas não é algo que eu possa escolher não fazer.  Então a forma pra ajudar a ter isso feito da forma mais rápida possível foi através dos uso de expect.

Primeiramente uma visão da rede:

 

Um diagrama feito no libreoffice draw.  Também nada glamouroso, mas deve dar conta do recado.  Eu rodo o script, que pede somente minha senha de rede uma vez que é o mesmo usuário no server-gw1.  E conecta via ssh.  No server-gw2 é o mesmo usuário e senha, o que facilita as coisa.  Dali pra rede k8s não tem mais nada porque eu acesso com um kube.conf e comand kubectl.

O script é esse aqui:


#! /usr/bin/expect

stty -echo
send_user -- "Entre a senha: "
expect_user -re "(.*)\n"
send_user "\n"
stty echo
set PASS $expect_out(1,string)


spawn ssh server-gw1

while {1} {
        expect {
                "ssword:" { send "$PASS\n" }
                "(yes/no)?" { send "yes\n" }
                "\$ " {break}
        }
}

send "ssh server-gw2; exit\n"
while {1} {
        expect {
                "ssword:" { send "$PASS\n" }
                "(yes/no)?" { send "yes\n" }
                "\$ " {break}
        }
}
interact

Note que é possível trocar pra receber o username como input ou como argumento do script.  Na chamada pro segundo servidor existe um 'send "ssh server-gw2; exit\n"'.  O motivo disso é pra quando eu digitar "exit" do servidor server-gw2 não precisar digitar novamente no server-gw1.  Então ele faz o ssh pro server-gw2 e o próximo comando esperando já é um exit.

Espero que ajude e happy coding!

Acessos: 300