gpt4 book ai didi

tcl - 当expect_out(buffer) size超过内部缓冲区大小时,如何获得expect的完整输出?

转载 作者:行者123 更新时间:2023-12-01 19:09:12 30 4
gpt4 key购买 nike

我不知道发生了什么,但我没有从执行的远程命令中获得完整的输出,可能是因为预计内部缓冲区正在执行。

    proc SendCommands { Commands } {
global prompt log errlog
foreach element [split $Commands ";"] {
expect {
-re $prompt
{send -- "$element\r"}
}
set outcome "$expect_out(buffer)"
foreach line [split $outcome \n] {
foreach word [regexp -all -inline {\S+} $line] {

if {( [string index [string trimleft $line " "] 0 ] == "%")} {
puts "$outcome"
exit 1
}
}
}
puts "$outcome"
}

}

set timeout 30

foreach host [ split $hosts "\;" ] {
spawn ssh -o "StrictHostKeyChecking no" "$username@$host"
match_max 10000000

expect {
timeout { send_user "\nFailed to get password prompt\n"; exit 1 }
eof { send_user "\nSSH failure for $host\n"; exit 1 }
"*?assword:*"
{
send -- "$password\r"
}

}


expect {
timeout { send_user "\nLogin incorrect\n"; exit 1 }
eof { send_user "\nSSH failure for $host\n"; exit 1 }

-re "$prompt"
{ send -- "\r" }
}
set timeout 300
SendCommands "$Commands"
}

这就是我执行它的方式:

./sendcommand aehj SWEs-elmPCI-B-01.tellus comnet1 "terminal length 0;show int description" "(.*#)$"

只有当我删除log user 0时,我才能获得完整的输出,但是当我在上面的函数sendcommands中使用puts命令时,我得到了大约90%的输出和10%的输出末尾的尾随数据未显示。

我想的一种方法是在expect中使用正则表达式的否定,但它似乎不起作用。

                                    expect {
-re ! $prompt
{puts $expect_outcome(buffer)}
}

编辑:当执行大约 5 或 7 次时,我得到所有输出一次

最佳答案

经过一番搜索后,我想出了这个,似乎可行,但请让我知道任何异常(exception)或更好的答案:

然后我设置 match_max = 1000

    expect {
-re $prompt
{send -- "$element\r"}

full_buffer {
append outcome $expect_out(buffer)
exp_continue
}

}
append outcome $expect_out(buffer)
puts $outcome

但当我设置 match_max = 10000 或 100 时,它仍然再次失败

关于tcl - 当expect_out(buffer) size超过内部缓冲区大小时,如何获得expect的完整输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16295724/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com