fragen stichworte

Erwarten Sie das Skript, und erwarten Sie, dass Sie die Sendefolge und den Verzögerungsfehler verfehlt haben

Ich schreibe das active.ksh-Skript (basierend auf Expect), um mich automatisch bei einer Solaris-Maschine anzumelden und den Befehl hostname auszuführen Maschinen)

Das Problem liegt bei expect; expect sendet die Kennwortzeichenfolge (pass123), und die Kennwortfrage wird verfehlt, und es wird immer noch auf das Kennwort gewartet.

Also wurde eigentlich das Passwort (pass123) nach dem Passwort eingegeben Frage. In den meisten Fällen funktioniert das Expect-Skript einwandfrei, aber manchmal hat es das Kennwort verfehlt.

BEISPIEL DES PROBLEMS

./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: 

THE 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"

BEISPIEL FÜR RECHTE ERGEBNISSE

 ./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.

antworten

Sie sollten es vermeiden, "Password:" zu verwenden, wenn Sie Ihre Strings während der Anmeldung überwachen, werden Sie feststellen, dass sie nicht immer großgeschrieben werden.

Das Ändern von expect auf -re "(.*)assword:" oder "assword:" ist tendenziell viel effektiver, um die Linie zu fangen.

Wenn Sie feststellen, dass die Timings noch zu schnell sind, können Sie einen Schlaf 1 setzen; vor deinem senden

Dies ist, was ich für expect

verwende  
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 }
}

Mir ist nicht klar, warum Sie expect überhaupt verwenden. Da Sie über einen SSH-Zugriff auf die Remote-Hosts verfügen, wäre die einfachste Lösung die explizite Einrichtung der öffentlichen Schlüsselauthentifizierung für diesen Zweck. dann könnten Sie einfach laufen ...

ssh 10.10.18.61 hostname

... und alles würde einfach funktionieren *. Selbst mit expect erledigen Sie zu viel Arbeit, da Sie selbst mit der Kennwortauthentifizierung den obigen Befehl ausgeben können und sich nicht um die Interaktion mit der Remote-Shell mit Expect sorgen müssen. Sie würden mit etwas wie:

schicken
#!/bin/sh

VIP_ADDRESS=10.10.18.61

expect <<EOF
spawn ssh $VIP_ADDRESS hostname
expect Password:
send "pass123\n"
expect eof
EOF

Und das ist es.

Sie können Ihre Expect-Skripts mit dem Flag -d debuggen. In meinem Fall umfasst die Ausgabe des obigen Expect-Skripts, das im Debug-Modus ausgeführt wird, Folgendes:

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"

Dies zeigt genau, was expect passt und was es sendet.

* Technisch müssen Sie möglicherweise einige Probleme mit dem Host lösen, dies ist jedoch einfach.