【发布时间】:2012-02-16 21:34:00
【问题描述】:
我已经编写了一个小的 Expect 脚本来登录 Cisco 设备;登录后,我想重复运行命令并grep 输出。
#!/usr/bin/expect
send_user "Device name: "
expect_user -re "(.*)\n"
set host $expect_out(1,string)
send_user "Username: "
expect_user -re "(.*)\n"
set user $expect_out(1,string)
stty -echo
send_user -- "Password: "
expect_user -re "(.*)\n"
set pass $expect_out(1,string)
stty echo
send_user "show int "
expect_user -re "(.*)\n"
set intf $expect_out(1,string)
send_user "\n"
spawn telnet $host
expect "Username:"
send "$user\r"
expect "Password:"
send "$pass\r"
expect ">"
此时我们已经登录到设备,我想重复执行命令“show int xxx”并grep特定行的输出。 grep 不在 Expect 中,也没有像 sleep 这样的命令,所以我可以循环执行 show int 命令,grepping 在我的特定行之外。我怎样才能像这样混合 Expect 和 Bash?
更新:我现在已经完成了相当多的脚本,一旦我克服了最后一个障碍,我会发布完整的脚本。一行set bytesnow [exec grep "packets input" \< showint | cut -d \ -f 9] 抛出错误;
child process exited abnormally
while executing
"exec grep "packets input" < \showint | cut -d \ -f 9"
但它在我编写的测试脚本中运行良好。文件 ./showint 在那里,在命令行上运行该命令可以正常工作吗?我不知道出了什么问题?
更新:更多调查 (http://wiki.tcl.tk/8489) 显示 grep 以状态码 1 退出,这意味着没有找到模式匹配,把该命令在命令行中可以正常工作吗?即使使用 /full/path/to/showint。
END:我意识到自己曾经是个傻瓜,从而纠正了我的错误,答案如下。感谢大家的帮助:D
【问题讨论】:
-
哈!错字,更正,欢呼;)
-
看来您正在
router#sh int <int> | i packets input字段中查找字段 9,并以空格作为分隔符。我的输出中只看到 8 个字段。你能告诉我们你想要完成什么吗?798518177 packets input, 60933723489 bytes, 0 no buffer -
我使用了“-f 9”,因为交换机/路由器上的那一行输出在开头有几个空格,用于缩进。我正在尝试按照该输出行的字节值工作。在底部查看我的答案。谢谢:)
标签: bash automation expect cisco