Using conditional statements inside 'expect'

automation, bash, conditional-statements, expect, telnet

Solution

Have to recomment the Exploring Expect book for all expect programmers -- invaluable.

I've rewritten your code: (untested)

proc login {user pass} {
    expect "login:"
    send "$user\r"
    expect "password:"
    send "$pass\r"
}

set username spongebob 
set passwords {squarepants rhombuspants}
set index 0

spawn telnet 192.168.40.100
login $username [lindex $passwords $index]
expect {
    "login incorrect" {
        send_user "failed with $username:[lindex $passwords $index]\n"
        incr index
        if {$index == [llength $passwords]} {
            error "ran out of possible passwords"
        }
        login $username [lindex $passwords $index]
        exp_continue
    }
    "prompt>" 
}
send_user "success!\n"
# ...

`exp_continue` loops back to the beginning of the expect block -- it's like a "redo" statement.

Note that `send_user` ends with `\n` not `\r`

You don't have to escape the `>` character in your prompt: it's not special for Tcl.

Problem

I need to automate logging into a TELNET session using expect, but I need to take care of multiple passwords for the same username. Here's the flow I need to create: - Open TELNET session to an IP - Send user-name - Send password - Wrong password? Send the same user-name again, then a different password - Should have successfully logged-in at this point... For what it's worth, here's what I've got so far: ``` #!/usr/bin/expect spawn telnet 192.168.40.100 expect "login:" send "spongebob\r" expect "password:" send "squarepants\r" expect "login incorrect" { expect "login:" send "spongebob\r" expect "password:" send "rhombuspants\r" } expect "prompt\>" { send_user "success!\r" } send "blah...blah...blah\r" ``` Needless to say this doesn't work, and nor does it look very pretty. From my adventures with Google expect seems to be something of a dark-art. Thanks in advance to anyone for assistance in the matter!

Original source