Não está claro para mim por que você está usando expect
. Como você tem acesso ssh aos hosts remotos, a solução mais fácil seria estabelecer ssh autenticação de chave pública explicitamente para essa finalidade; então você poderia simplesmente correr ...
ssh 10.10.18.61 hostname
... e tudo iria simplesmente funcionar *. Mesmo usando expect
você está fazendo muito trabalho, já que, mesmo usando a autenticação por senha, você poderia emitir o comando acima e não ter que se preocupar em interagir com o shell remoto usando o expect. Você enviaria algo como:
#!/bin/sh
VIP_ADDRESS=10.10.18.61
expect <<EOF
spawn ssh $VIP_ADDRESS hostname
expect Password:
send "pass123\n"
expect eof
EOF
E é isso.
Você pode depurar seus scripts esperados usando o sinalizador -d
. No meu caso, a saída do script de espera acima executado no modo de depuração inclui o seguinte:
expect: does "" (spawn_id exp4) match glob pattern "password:"? no
lars@localhost's password:
expect: does "lars@localhost's password: " (spawn_id exp4) match glob pattern "password:"? yes
expect: set expect_out(0,string) "password:"
expect: set expect_out(spawn_id) "exp4"
expect: set expect_out(buffer) "lars@localhost's password:"
send: sending "PASSWORD\n" to { exp4 }
myhost.example.com
expect: read eof
expect: set expect_out(spawn_id) "exp4"
expect: set expect_out(buffer) " \r\nobliquity.int.seas.harvard.edu\r\n"
Isso mostra exatamente o que expect
está correspondendo e o que está enviando.
* Tecnicamente, você pode ter que resolver alguns problemas da chave do host, mas isso é fácil.