我写了一个小的 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