espera script + espera perder a sequência de envio + atraso

5

Eu escrevo o script active.ksh (baseado no expect) para fazer login automaticamente em alguma máquina Solaris e executar o comando hostname (efetue login no IP virtual para verificar qual hostname é a máquina ativa - tenho dois cluster solaris máquinas)

O problema é com expect ; esperar envia a seqüência de senha (pass123) e perde a pergunta de senha e ainda aguarda a senha.

Então, na verdade, a senha (pass123) foi digitada após a senha questão. Na maioria dos casos, o script de espera funciona bem, mas às vezes perdeu a senha.

EXEMPLO DO PROBLEMA

 ./active.ksh
 spawn ssh 10.10.18.61
 sh: /usr/local/bin/stty: not found
 This computer system, including all related equipment, networks and network devices      (specifically including Internet access),is provided only for authorized uss
 Password:        * my remark - pass123 string was missed the Password Question        pass123
 Password: 

O SCRIPT

  #!/bin/ksh

  VIP_ADDRESS=10.10.18.61


  expect_for_verify_which_active_machine='cat << EOF
  set timeout -1
  spawn  ssh   $VIP_ADDRESS 
  expect {
  ")?"   { send "yes\r"  ; exp_continue  }
  Password:  {send "pass123\r"}
  }
  expect >  {send "hostname\r"}
  expect >    {send exit\r}
  expect eof
  EOF'


  expect -c  "$expect_for_verify_which_active_machine"

EXEMPLO DE RESULTADOS CORRETOS

  ./active.ksh 
  [Friday, February 24, 2012  2:32:06 PM IST] INFO Verify which is active SMU machine 
  spawn ssh 10.10.18.61
  sh: /usr/local/bin/stty: not found
  This computer system, including all related equipment, networks and network devices       (specifically including Internet access),is provided only for authorized uss
  yes
  Password: 
  Last login: Fri Feb 24 14:32:06 2012 from smu1a
  This computer system, including all related equipment, networks and network devices       (specifically including Internet access),is provided only for authorized uss
  solaris1:/ ROOT > hostname
  solaris1
  solaris1:/ ROOT > exit

  logout
  Connection to 10.10.18.61  closed.
    
por Eytan 24.02.2012 / 14:39

2 respostas

5

Você vai querer evitar o uso de "Password:" se você monitorar suas strings durante o login, você descobrirá que nem sempre é capitalizado.

Alterar a sua expectativa para -re "(.*)assword:" ou "assword:" tende a ser muito mais eficaz para alcançar a meta.

Se você achar que os horários ainda são muito rápidos, você pode colocar um período de sono 1; antes do seu envio

Isto é o que eu uso para esperar

expect {
    "(yes/no)?" { send "yes\n" }
    "passphrase" { send "\r" }
    -re "(.*)assword:"  { sleep 1; send -- "password\r" }
    -re $prompt { return }
    timeout     { puts "un-able to login: timeout\n"; return }
    eof         { puts "Closed\n" ; return }
}
    
por 25.02.2012 / 01:46
3

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.

    
por 24.02.2012 / 15:01