Read file into String and do a loop in Expect Script Read file into String and do a loop in Expect Script unix unix

Read file into String and do a loop in Expect Script


The code should read the contents of the two files into lists of lines, then iterate over them. It ends up like this:

# Set up various other variables here ($user, $password)# Get the list of hosts, one per line #####set f [open "host.txt"]set hosts [split [read $f] "\n"]close $f# Get the commands to run, one per lineset f [open "commands.txt"]set commands [split [read $f] "\n"]close $f# Iterate over the hostsforeach host $hosts {    spawn ssh $user@host    expect "password:"    send "$password\r"    # Iterate over the commands    foreach cmd $commands {        expect "% "        send "$cmd\r"    }    # Tidy up    expect "% "    send "exit\r"    expect eof    close}

You could refactor this a bit with a worker procedure or two, but that's the basic idea.


I'd refactor a bit:

#!/usr/bin/expectset timeout 20set user testset password testproc check_host {hostname} {    global user passwordt    spawn ssh $user@$hostname    expect "password"    send "$password\r"    expect "% "                ;# adjust to suit the prompt accordingly    send "some command\r"    expect "% "                ;# adjust to suit the prompt accordingly    send "exit\r"    expect eof}set fp [open commands.txt r]while {[gets $fp line] != -1} {    check_host $line}close $fp


Using any of the two solutions here, I would also create a logfile that you can view at a later time. Makes it easy to troubleshoot any problems after the script is run, especially if you're configuring several hundred hosts.

Add:

log_file -a [log file name]

Before your loop.

Cheers,

K