在期望中循环来自文件的行

时间:2016-12-07 00:57:37

标签: linux expect

脚本新手,要小心......

我正在尝试使用这个代码,我通过阅读几个博客来整理这些代码。我的想法是让这个脚本读取我在ips.txt上保存的IP,然后使用给定的凭据运行代码到ssh到读取IP,执行如下所述的几个发送命令,退出ssh会话,然后重复使用ips.txt文件中的第二行,这是一个不同的IP,直到它完成IP列表。

注意:ips.txt文件是一个简单的IP地址列表,如下所示(IP之间没有空格):

192.168.0.2

192.168.0.3

192.168.0.4

...

spawn,expect和send命令工作正常。它也可以循环回到代码的开头,但它不会读取ips.txt文件中的第二个IP;它将再次读取第一个并反复执行相同的步骤。

请协助......

date_range

1 个答案:

答案 0 :(得分:2)

让我们尝试将代码简化为最低限度地再现问题的东西。你说循环重复使用相同的ip值,对吧?因此,让我们删除与远程系统交互的代码:

#!/usr/bin/expect
set fildes [open "ips.txt" r]
set ip [gets $fildes]

while {[string length $ip] != 1} {
    puts $ip
    set ip [gets $fildes]
}

close $fildes

运行时会发生什么?

我希望永远不会满足while条件:您将读取文件,打印每一行,然后打印无限数量的空白行。当您读取文件的最后一行时,您会得到字符串,而不是长度为1的字符串。

你很可能想要

#!/usr/bin/expect

set timeout 180
set username admin
set password Changeme1
set fildes [open "ips.txt" r]

# the 2-argument form of `gets` returns -1 when it can't read another line
while {[gets $filedes ip] != -1} {
   spawn ssh $username@$ip
   expect "password:"
   send "$password\r"
   expect ".mi"
   send "show sw\r"
   expect ".mi"
   send "exit\r"
   expect eof         ;# wait for the connection to close
}

close $fildes