O problema é que você tem variáveis que você espera que sejam substituídas em momentos diferentes (mesmo em servidores diferentes), mas você codificou o script para que eles sejam todos substituídos uma vez, quando a função bash é executada. Um bash aqui-doc age como uma string entre aspas duplas, portanto, todas as variáveis $ip
, $thirdoctet
e $i
são substituídas antes que o texto do heredoc seja entregue ao comando expect. Parece que você deseja que $ip
e $thirdoctet
sejam expandidos, mas não $i
. Você precisará ser um pouco mais inteligente em citações.
Eu faria isso:
- cite o heredoc, para que nenhuma variável seja substituída pelo shell
- exporte as variáveis
$ip
e$thirdoctet
para que seja possível acessá-las. - escape da variável
$i
, de forma que ela seja apenas substituída por bash na máquina remota - você esqueceu de "apertar enter" - faltando
\r
em alguns comandos de envio
function get-arp {
export ip
export thirdoctet
# note the quotes: ........................v...v
/usr/bin/expect > arista-arp-dump-${ip} << 'EOF'
# use the 'ip' variable from the environment
spawn ssh admin@$env(ip)
expect "assword: "
send "password\r"
expect "localhost>"
# use the 'thirdoctet' variable from the environment and escape '\$i'
send "bash for i in 'seq 1 5'; do ping -c 1 10.$env(thirdoctet).1.\$i; done\r"
expect "localhost>"
send "bash for i in 'seq 10 19'; do ping -c 1 10.$env(thirdoctet).1.\$i; done\r"
expect "localhost>"
send "show ip arp\r"
expect "localhost>"
send "exit\r"
expect "eof"
EOF
...