使用expect循环输出并发送到文件

时间:2012-04-13 03:56:17

标签: expect

我正在尝试使用expect登录设备,获取配置,并将其写入文件(我不能使用ssh密钥,设备不支持它,并且实际上有两个登录)。

问题是当我使用它时,数据被截断(我只得到配置文件的最后~100行):

...snip...
match_max 100000
set timeout 150
set output [open "outputfile.txt" "w"]
set config $expect_out(buffer)
puts $output $config
close $output
...snip...

所以现在,根据我在某处读到的建议,我试图使用expect循环输出,一次一行,但是我无法将数据输出,就像没有循环一样。这是不起作用的代码。配置是〜700行。

#!/usr/bin/expect
match_max 50000
spawn ssh admin@192.168.1.10
expect "password"
send "password1\r"
expect "user"
send "root\r"
expect "password"
send "password2\r"

set outcome {}
set writeout [open "outputfile.txt" "w"]

expect "device"
exp_send "show running\r"
expect {
        -regexp {.*}{
        set outcome "${outcome}$expect_out(0,string)"
        exp_continue
        }
}
puts $writeout $outcome
close $writeout

expect "device"
send "exit\r"
send "yes\r"

任何帮助将不胜感激。如果您需要更多信息,请与我们联系。

谢谢!

2 个答案:

答案 0 :(得分:0)

您提供的循环等同于等待超时(默认为10秒,因为脚本未设置它)。

show running打印输出多长时间?可能值得等待命令完成后显示的某些模式(我假设它是"device",但可能更好地提供更具体的终端条件。)

exp_send "show running\n"
expect "show running" ;#don't want the command present in captured output
set timeout 60
expect {
   "device" { set raw_outcome $expect_out(0,string) }
   timeout { error "command didn't finish in 60 sec?' }
}
#now the raw_outcome contains everything what was displayed up-to the "device"
#including this string, so filter out the terminal condition:
regexp {(.*)device} $raw_outcome match outcome
puts $writeout $outcome
...

答案 1 :(得分:0)

此错误原因的根源是Expect的多线程:Expect在单独的线程中开始与远程系统通信,并且不会将其输出与maint线程的输出同步。所以,如果你在一个较差的线程完成之前尝试向主线程的sdtout写一些东西,你可能会在Expect中遇到死锁。