Posted to tcl by schelte at Thu Oct 27 14:28:01 GMT 2011view pretty

#!/usr/bin/expect -f

set timeout 5

set load_fh [open "targets.txt" r]
set ip_list [split [read $load_fh] "\n"]
close $load_fh

set load_fh [open "usersandpass.txt" r]
set name_pass [split [read $load_fh] "\n"]
close $load_fh

# Read command as arg to this script
set routercmd [lindex $argv 0]

proc operate {ip routercmd name_pass} {
        send_user "telnet to this host: $ip\n"

        # Connect
        spawn telnet $ip

        expect_before -re {Bad username|Login incorrect} {
                send_user -- "$ip: auth problem. last output:\n $expect_out(buffer)\n=========\n"
                catch {exp_close}
                return
            } -re {Unable to connect to remote host|Connection closed by foreign host} {
                send_user -- "$ip: connection problem. last output:\n $expect_out(buffer)\n=========\n"
                catch {exp_close}
                return
            } timeout {
                send_user "$ip: timeout"
                catch {exp_close}
                return
            } eof {
                send_user "$ip: close connection. last output:\n $expect_out(buffer)\n=======\n"
                return
            }

        foreach {name pass} $name_pass {
            if {$name eq {} || $name eq {}} {
                continue
            }

            set done 0

            # send username & password
            expect -re {ogin|sername} {
                    send -- "$name\r"
                    exp_continue
                } {assword} {
                    send -- "$pass\r"
                }

            # expect one of these strings and take an action depending which one comes
            # replace "Login incorrect" with whatever message your router sends
            expect {cli>} {
                    send "shell\n"

                    # execute command , supposed we r using ash at aztech router
                    expect -re {#} {
                        send -- "$routercmd\r"
                    }
                } {Do you want to spawn a shell instead} {
                    send "y\n"

                    # execute command , supposed we r using ash at aztech router
                    expect -re {#} {
                        send -- "$routercmd\r"
                    }
                } {#} {
                    send -- "$routercmd\r"
                }

            expect {#} {
                set done 1
            }

            if {$done} {
                break
            }
        }

        send_user "end processing host: $ip\n\n"
        # close the child process
        catch {exp_close}
}

foreach ip $ip_list {
        if {$ip == ""} {
            continue
        }
	operate $ip $routercmd $name_pass
}