set login "sasuke"
set addr "hostname"
set pw "mypasswd"
spawn ssh $login@$addr
expect "$login@$addr's password:"
send "$pw\r"
expect "#"
send {output=$(sudo virsh list --all | awk '/running/{print }' | tail -2)}
expect {
password: {send "$pw\r"; exp_continue}
"#"
}
send {sudo virsh dominfo "$output"} ;# don't know if you need quotes there
expect {
password: {send "$pw\r"; exp_continue}
"#"
}
No Tcl (e, por extensão, expect), chaves como as aspas simples do shell: inibem a expansão da variável.
A forma multi-padrão de esperar é útil para o caso em que você não pode ver um padrão. A instrução exp_continue
essencialmente "faz um loop" dentro do esperado, para que você possa enviar a senha e continuar esperando o prompt. Como não há ação associada ao padrão de prompt, o controle passa do comando expect para o próximo.
Eu recomendo que você salve isso como um script separado. Primeira linha deve ser
#!/usr/bin/expect -f
Se você quiser incorporar em um script de shell:
#!/bin/sh
expect <<'END'
# code as above
END
Observe as aspas ao redor do primeiro "END" - que tem o efeito de uma única citação de todo o documento aqui, assim você não precisa se preocupar com o shell interpretando as variáveis Esperadas