0

我正在尝试使用 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"

任何帮助将不胜感激。如果您需要更多信息,请告诉我。

谢谢!

4

2 回答 2

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
...
于 2013-02-20T10:37:33.183 回答
0

这个错误的根源是Expect的多线程:Expect在一个单独的线程中开始与远程系统通信,并且它的输出不与maint线程的输出同步。因此,如果您尝试在子线程完成之前向主线程的 sdtout 写入内容,您可能会在 Expect 中遇到死锁。

于 2014-03-25T09:25:36.477 回答