【发布时间】:2019-08-12 23:11:33
【问题描述】:
我正在尝试使用 expect 脚本通过 telnet 访问远程设备,在本地读取/保存远程“EVENTLOG”,然后从日志文件中提取特定行(序列号)。问题是日志文件不断变化,所以我需要一种搜索特定字符串的方法。远程设备是基于 Linux 的,但没有 grep、vi、less 等,因为它是 QNX Neutrino,因此必须在本地进行。
我已经成功地获得了 telnet,读取文件并在本地保存在控制之下,但是当我开始“读取”文件时,我遇到了问题。目前我只是想让它打印它找到的内容,但脚本只是退出,除了一些额外的大括号之外没有报告任何内容??
#!/usr/bin/expect -f
set timeout -1
log_user 1
spawn telnet $IP
match_max 100000
expect "login:"
send -- "$USER\r"
expect "Password:"
send -- "$PW\r"
expect "# "
send -- "\r"
#at this point logged into device
#send command to generate the "dallaslog"
set dallaslog [open dallaslog.txt w]
expect "#"
send -- "cat `ls -rt /LOG/event*`\r"
expect "(cat) exited status=0"
set logout $expect_out(buffer)
puts $dallaslog "$logout"
close $dallaslog
unset expect_out(buffer)
set dallasread [open dallaslog.txt r]
set lines [split [read $dallasread] "\r"]
close $dallasread
puts "${green}$lines{$normal}"
#a debug line to print $dallasread in green so I can verify it works up to here
foreach line $lines {
if {[regexp {.*Dallas ID: 0.*\n} $lines match]} {
if {$match == 1} {
puts $line ;# Prints whole line which has 1 at end
}
}
}
expect "# "
send -- "exit\r"
interact
我(最终)要寻找的是捕获以“Dallas ID:”开头的任何行然后将该信息保存到变量中的脚本,因此我可以使用“scan”命令来解析该行并提取信息。
我得到的是:
(the results from $lines being "puts" in green)
"...
<ENTRY TIME="01/01/1970 00:48:07" PROC="syncd" FILE="mips.cc" LINE="208" NUM="10000">
UTC step from 01/01/1970 00:48:08 to 01/01/1970 00:48:07
</ENTRY>
Process 3174431 (cat) exited status=0
}{}
# exit
Process 3162142 (sh) exited status=0.
Connection closed by foreign host."
提前感谢您的所有帮助。我是 TCL/expect 的新手(自去年 7 月以来一直在玩弄它),但我发现它是一个非常强大的工具,但我很难调试!
编辑:根据@meuh 的回复添加了更多信息。 示例:达拉斯 ID 最多可以有 4 个,但一般我只有 0 和 1。目标是将到达达拉斯 ID 的 SN、BC、CN 保存为变量以放入单独的文本文件中。
<ENTRY TIME="01/01/1970 00:00:06" PROC="sys" FILE="PlatformUtils.cpp" LINE="1227" NUM="10044">
Dallas ID: 1 SN:00000622393A BC: J4AD945 CN: IS200BPPBH2BMD R0: 001C
</ENTRY>
我使用的 foreach 循环是一个关于堆栈溢出的旧问题的示例,我尝试修改以在此处使用,但未成功。
编辑:我还应该提到,这个事件日志每次被读取时大约有 800 行长,这就是为什么我没有发布它的摘录。
【问题讨论】:
-
您可能希望使用
log_file dallaslog.txtexpect 命令,而不是手动捕获输出并写入文件 -
@glennjackman 我尝试了你的建议,使用命令
log_file -noappend dallaslog.txt但脚本似乎无法打开 dallaslog.txt 文件,因为我的puts $lines命令不再有输出 -
您可以在
cat命令完成后关闭日志记录:使用不带参数的log_file。 -
一个有趣的发现:如果我使用
log_file命令然后设置log_user 0来隐藏控制台输出,那么日志中的变量就会变得未定义。但是,如果我手动捕获输出(即使禁用了控制台输出),它也一切正常。除非我使用-a命令!太棒了!