Read file into String and do a loop in Expect Script

expect, loops, shell, tcl, unix

Solution

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 line
set f [open "commands.txt"]
set commands [split [read $f] "\n"]
close $f

# Iterate over the hosts
foreach 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.

Problem

What I am trying to do is to: - Create a `.exp` file, which will read from the `*.txt` file from the same directory and parse all the content in the text file into a string variable in the expect script. - Loop the string, which contains a series of host names, and excecute a series of command until the string is enumerated. So what the script does, is read a series of hostname from a `txt` file in the same directory, and then read them into a string, and the `.exp` file will auto log into each of them and excecute a series of commands. I have the following code written but it's not working: ``` #!/usr/bin/expect set timeout 20 set user test set password test set fp [open ./*.txt r] set scp [read -nonewline $fp] close $fp spawn ssh $user@$host expect "password" send "$password\r" expect "host1" send "$scp\r" expect "host1" send "exit\r" ``` Any help is greatly appreciated....

Original source