【问题标题】:Suppress expect output抑制期望输出
【发布时间】:2018-02-25 05:27:23
【问题描述】:

我有以下脚本登录到路由器并执行命令。我怎样才能只列出输出而不显示其他任何内容。

#!/usr/bin/expect -f
set timeout 3000
log_user 0
spawn ssh -o StrictHostKeyChecking=no ananair@172.20.60.187
expect {
"*assword:" {
send "anismi@123\n"
expect "*#"
log_user 1
send "show bgp vrf IKA summary | include 10.155.192.50\n"
expect "*#"
}
}

这是上面脚本的输出。

[root@cap-nwmon-01 anand]# ./migrate.sh
show bgp vrf IKA summary | include 10.155.192.50
Sun Feb 25 07:17:25.150 EET
10.155.192.50     0 65256 3107179 4237248  1624156    0    0    5d17h        322

这是我想要的脚本的唯一输出。

Sun Feb 25 07:17:25.150 EET
10.155.192.50     0 65256 3107179 4237248  1624156    0    0    5d17h        322

【问题讨论】:

  • expect /the/script.exp | tail -n 2 呢?
  • 这很有用,但对我不起作用..因为我在上面的代码中为其他设备提供了更多输出。
  • 请更新您的问题以说明您的真实需求。

标签: linux bash shell unix expect


【解决方案1】:

您会看到额外的行,因为您在send "show..." 之前给出了命令log_user 1,这导致"show..." 的回显被记录到标准输出。如果您稍后将此命令移到send 之后,并通过添加expect "\n" 来等待回显完成,那么您将看到更少:

expect "#"
send "show bgp vrf IKA summary | include 10.155.192.50\n"
expect "\n"
log_user 1
expect "#"

请注意,模式开头的* glob 字符没有任何作用。

或者,您应该考虑使用变量$expect_out(buffer),而不是更改log_user,它保存与模式匹配的内容,包括在内。

【讨论】:

  • 感谢这从输出中清除了发送命令。但它显示了运行命令的设备的主机名。在最后一行RP/0/RSP0/CPU0:cap-s12a-core-rtr1#[root@cap-nwmon-01 anand]#
  • 由于您只想查看回复的前两行,而不是命令提示符#,因此您可以将查找提示符的expect "#" 替换为例如@ 987654333@,即两个换行符。 (-gl 选项是为了确保 expect 理解字符串是一个 glob 模式,因为带有\n 的字符串在这种情况下可能会被误解。
  • 还有一个疑问..假设我的输出有 3 行我如何编写期望 -gl
  • 添加另一个 *\n 以匹配任何字符,然后是换行符:expect -gl "\n*\n*\n"
【解决方案2】:

也许尝试重定向不需要的输出,例如

send "show bgp vrf IKA summary | include 10.155.192.50\n" &> /dev/null

将它的 stdout 和 stderr 重定向到遗忘的虚无

【讨论】:

  • 期待不明白&> /dev/null