除了tcl,几乎没有什么损失

除了tcl,几乎没有什么损失,tcl,telnet,expect,Tcl,Telnet,Expect,我有一个expect脚本,它远程登录到路由器,发出命令并记录输出。以下代码段应该是理想的输出 ========================================================================== slot type number number rev. addresses ---- ------------------ ---------- ----------

我有一个expect脚本,它远程登录到路由器,发出命令并记录输出。以下代码段应该是理想的输出

==========================================================================
slot          type            number       number       rev.     addresses
----   ------------------   ----------   ----------   --------   ---------
0/0    GE-4 IOA             4306297694   4500006802     A04          4    
0/1           ---              ---          ---         ---         ---   
1/0    GE-4 IOA             4306255468   4500006802     A04          4    
1/1           ---              ---          ---         ---         ---   
2/0    GE-8 IOA             4306211660   4500009102     A05          8    
2/1           ---              ---          ---         ---         ---   
3/0           ---              ---          ---         ---         ---   
3/1           ---              ---          ---         ---         ---   
4/0           ---              ---          ---         ---         ---   
4/1           ---              ---          ---         ---         ---   
5/0    OC3/STM1-8 ATM IOA   4305503226   4500006903     A02               
5/1           ---              ---          ---         ---         ---   
7/0    SRP IOA              4306297292   4501006502     A00          2    
11/0   Service IOA          4306516819   4501007103     A00               
11/1          ---              ---          ---         ---         ---   
12/0          ---              ---          ---         ---         ---   
12/1          ---              ---          ---         ---         ---   
13/0      GE-4 IOA             4306255468   4500006802     A04          4    
13/1          ---              ---          ---         ---         ---   
14/1          ---              ---          ---         ---         ---   
15/0          ---              ---          ---         ---         ---   
15/1          ---              ---          ---         ---         ---   
==========================================================================
但我得到的是。。。13/0行已损坏,13/1完全丢失,这是相当一致的-只有这些行已损坏。我已将match_max设置为60000。我甚至在发送命令后添加了“睡眠10”

==========================================================================
slot          type            number       number       rev.     addresses
----   ------------------   ----------   ----------   --------   ---------
0/0    GE-4 IOA             4306297694   4500006802     A04          4    
0/1           ---              ---          ---         ---         ---   
1/0    GE-4 IOA             4306255468   4500006802     A04          4    
1/1           ---              ---          ---         ---         ---   
2/0    GE-8 IOA             4306211660   4500009102     A05          8    
2/1           ---              ---          ---         ---         ---   
3/0           ---              ---          ---         ---         ---   
3/1           ---              ---          ---         ---         ---   
4/0           ---              ---          ---         ---         ---   
4/1           ---              ---          ---         ---         ---   
5/0    OC3/STM1-8 ATM IOA   4305503226   4500006903     A02               
5/1           ---              ---          ---         ---         ---   
7/0    SRP IOA              4306297292   4501006502     A00          2    
11/0   Service IOA          4306516819   4501007103     A00               
11/1          ---              ---          ---         ---         ---   
12/0          ---              ---          ---         ---         ---   
12/1          ---              ---          ---         ---         ---   
13/0   G    ---   
14/1          ---              ---          ---         ---         ---   
15/0          ---              ---          ---         ---         ---   
15/1          ---              ---          ---         ---         ---   
==========================================================================
我不明白为什么会这样

这是密码

if {[info exists router_name]} {
    spawn telnet $router_name
    sleep 3
} else {
    return "Spawner<< No router_name\n"
}

##newly added
expect -re ".*>|.*#" {
        exp_send "term len 0\n" 

    puts "issuing show hard"
    expect -re ".*>|.*#" {  
        exp_send "show hard\n"
    }

    #sleep 10
    #puts "issuing newlines"
    expect -re ".*>|.*#" { exp_send "exit\n\n\n\n" }
} -re ".*login.*|.*name.*" {
    if {[info exists router_username]} {
        exp_send "$router_username\n"
    }   
    exp_continue
} -re ".*word*" {
    if {[info exists router_pass]} {
        exp_send "$router_pass\n"
    }   
    exp_continue    
} 

expect -re ".*" {}

close
如果{[info exists router_name]}{
生成telnet$router\u名称
睡眠3
}否则{
返回“产卵器*{
exp\u发送“术语长度0\n”
让“发布秀”难上加难
expect-re.“*>.*.*.”{
exp\u发送“硬显示\n”
}
#睡眠10
#放置“发布换行符”
expect-re“.*>.*.*.{exp\u send”退出\n\n\n}
}-re.“*login.*name.*”{
如果{[info exists\u username]}{
exp\u发送“$router\u username\n”
}   
exp\u继续
}-re.“*word*”{
如果{[info exists\u pass]}{
exp\u发送“$router\u pass\n”
}   
exp\u继续
} 
expect-re“.*”{}
关闭

exp_send“show hardware\n”行是给定的命令-我需要该命令的输出。

正如@DonalFellows所建议的那样-解决方法完成了任务

添加一个段以检测“-More--”并发送“\n\n”将不中断地接收输出

这是更改后的代码

if {[info exists router_name]} {
    spawn telnet $router_name
    sleep 3
} else {
    return "Spawner<< No router_name\n"
}

expect -re ".*>|.*#" {
        exp_send "term len 0\n" 

    puts "issuing show hard"
    expect -re ".*>|.*#" {  
        exp_send "show hard\n"
    }

    #sleep 10

    expect -re ".*>|.*#" {
        exp_send "exit\n\n\n\n"
    } -re ".*--More--.*" {
        exp_send "\n\n"
    }

} -re ".*login.*|.*name.*" {
    if {[info exists router_username]} {
        exp_send "$router_username\n"
    }   
    exp_continue
} -re ".*word*" {
    if {[info exists router_pass]} {
        exp_send "$router_pass\n"
    }   
    exp_continue    
} 

expect -re ".*" {}

close
如果{[info exists router_name]}{
生成telnet$router\u名称
睡眠3
}否则{
返回“产卵器*{
exp\u发送“术语长度0\n”
让“发布秀”难上加难
expect-re.“*>.*.*.”{
exp\u发送“硬显示\n”
}
#睡眠10
expect-re.“*>.*..”{
exp\u发送“退出\n\n\n\n”
}-re.“*--更多--.*”{
exp\u发送“\n\n”
}
}-re.“*login.*name.*”{
如果{[info exists\u username]}{
exp\u发送“$router\u username\n”
}   
exp\u继续
}-re.“*word*”{
如果{[info exists\u pass]}{
exp\u发送“$router\u pass\n”
}   
exp\u继续
} 
expect-re“.*”{}
关闭

有趣;输出到损坏点的长度约为1500字节。我能想到的唯一与这类事情相关的是某种以太网数据包帧大小,或者可能是MTU。这有什么关系?TCP应该将我们与这类事情隔离开来……您最好通过sett解决这一问题比如说,15,让你的expect脚本知道如何处理分页。这将是一个难看的解决办法,但至少是可能的……在任何人问起之前,我对expect的详细信息的了解是不可靠的,我对Cisco路由器固件的了解完全不存在。我可以用谷歌搜索,但你也可以这样做。(或者其他人可以通过正确的回答告诉你怎么做。)@DonalFellows:谢谢,我会试试你在第二条评论中说的那个。@DonalFellows:确实有效。非常感谢。