expect + como identificar se espera quebrar por falta de tempo?

5

O destino do seguinte script simples é obter o nome hostname na máquina remota

Às vezes, espera-se que o script falhe ao executar o ssh para $ IP_ADDRESS (porque a máquina remota não está ativa, etc)

então, neste caso, o script esperado irá quebrar após 10 segundos (tempo limite 10), isso é OK, mas ......

Existem duas opções

  1. Espere que o script execute ssh com êxito e execute o comando hostname na máquina remota
  2. Espere a quebra do script porque o tempo limite foi de 10 segundos

Em ambos os casos, espere que saia

  • no caso de ssh esperar com sucesso vai quebrar após 0.5-1 segundo, mas no caso de ssh ruim, então ele vai quebrar depois de 10 segundos

mas eu não sei se espera que o script execute ssh com sucesso ou não?

é possível identificar o processo de tempo limite? ou para verificar que a expectativa terminou porque o tempo limite?

Observação minha versão de máquina Linux - Red Hat 5.1

Espere pelo script

 [TestLinux]# get_host_name_on_remote_machine='cat << EOF
  > set timeout 10
  > spawn  ssh   $IP_ADDRESS
  >            expect {
  >                      ")?"   { send "yes\r"  ; exp_continue  }
  > 
  >                      word:  {send $PASS\r}
  >                   }
  > expect >  {send "hostname\r"}
  > expect >    {send exit\r}
  > expect eof
  > EOF'

Exemplo caso não tenhamos conexão com o host remoto

 [TestLinux]# expect -c  "$get_host_name_on_remote_machine"
 spawn ssh 10.17.180.23
 [TestLinux]# echo $?
 0
    
por Eytan 11.03.2012 / 19:30

2 respostas

2

você pode esperar o tempo limite, algumas versões requerem -timeout exatamente como -regex para testar a invocação do tempo limite.

você espera que a declaração possa se tornar

expect {
    ")?"    { send "yes\r"  ; exp_continue  }
    word:   { send $PASS\r}
    timeout { puts "failed to SSH" }
       } 
    
por 16.03.2012 / 22:13
0

Eu sei que isso não é exatamente o que você pediu, mas eu gostaria de oferecer uma alternativa. Use chaves ssh em vez de senhas e scripts bash em vez de Expect:

output=$(ssh -o ConnectTimeout=10 -o BatchMode=yes -o StrictHostKeyChecking=no $IP_ADDRESS "hostname")

if [ $? -eq 255 ]; then
    # Some error occured while attempting to connect.
else
    # Success!
fi

Isso não indica explicitamente que houve um tempo limite versus falha ao efetuar login com uma chave privada, etc., mas é melhor do que escrever Esperar.

    
por 12.03.2012 / 02:11