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