expect script + expect miss the send string + delay issue
You will want to avoid using "Password:" if you monitor your strings during login, you will find that it is not always capitalized.
Changing your expect to -re "(.*)assword:"
or "assword:"
tends to be much more effective for catching the line.
If you find that the timings are still too quick you can put a sleep 1; before your send
This is what i use for expect
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 }
}
It's not clear to me why you're using expect
at all. Since you have ssh access to the remote hosts, the easiest solution would be to establish ssh public key authentication explicitly for this purpose; then you could simply run...
ssh 10.10.18.61 hostname
...and everything would Just Work*. Even using expect
you're doing too much work, since even using password authentication you could issue the above command and not have to worry about interacting with the remote shell using expect. You'd send up with something like:
#!/bin/sh
VIP_ADDRESS=10.10.18.61
expect <<EOF
spawn ssh $VIP_ADDRESS hostname
expect Password:
send "pass123\n"
expect eof
EOF
And that's it.
You can debug your expect scripts using the -d
flag. In my case, the output of the above expect script run in debug mode includes the following:
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"
This shows exactly what expect
is matching and what it's sending.
* Technically you might have to resolve some host key issues, but this is easy.