Brian
Brian

Reputation: 1

Getting error in expect for loop

Expect Script "testscript2":

#!/usr/bin/expect
set hostlist [open ./host_list]
set ipaddrs [read $hostlist]

foreach line [split $ipaddrs \n] {

        spawn scp id_dsa.pub root@$line:~/.ssh
        set pass "abc123"
        expect {
        "yes/no" {send "yes\r"}
        password: {send "$pass\r"; exp_continue}
                  }
}

The above works except there are these annoying errors which really have no effect on the outcome of the file transfer:

./testscript2
spawn scp id_dsa.pub root@lsvm-nagios1:~/.ssh
id_dsa.pub 100% 20 0.0KB/s 00:00
spawn scp id_dsa.pub root@:~/.ssh
ssh: : Name or service not known
lost connection

As you can see above the transfer occurs but the for loop iterates one extra time after there are no more server names in host_list. I think what is happening is that the last time the for loop iterates it sees that exp_continue statement and since there are no more server names in host_list it throws that error. Hence the "root@:~".

Upvotes: 0

Views: 1356

Answers (1)

Colin Macleod
Colin Macleod

Reputation: 4382

If the host_list file ends with a newline character, the [split] will give an extra element for the empty last line. To skip this, try adding the following line before the spawn command:

if {$line == ""} continue

Upvotes: 2

Related Questions