我有一个expect/Tcl
脚本作为我的bash脚本的一部分,可以登录到远程路由器。现在,出于测试目的,我正试图处理超时问题。我的问题是expect / Tcl脚本没有记录到我的日志文件中,当它执行时它会记录SSH连接打印到我的提示的所有内容,这不是我想要的。
这是我的期望剧本:
/usr/bin/expect<<EOF
set timeout 5
set send_human {.1 .3 1 .05 2}
set myStamp [exec date +\[%d\/%m\/%Y\ \%T\]]
set log_file ~/mylogfile.log
spawn ssh -o "StrictHostKeyChecking no" "me\@$1"
expect {
"password: " { send -h "mypassword\r" }
"No route to host" { exit 1 }
timeout { send_log "\$myStamp Timed out to $1\n"]; exit 1 }
}
send -h "reboot in 1\r"
sleep 1
send -h "exit\r"
expect eof
EOF
请记住,这是我的bash脚本中传递路由器名称的函数的一部分,因此参数$1
。
有什么想法吗?
答案 0 :(得分:3)
您想使用log_file
命令,而不是设置log_file 变量
log_file ~/mylogfile.log
其他说明:
Tcl有一个非常好的内置命令来处理时间,不需要呼叫到目前为止:
set myStamp [clock format [clock seconds] -format {[%d/%m/%Y %T]}]
@ 字符在Tcl / expect中并不特殊,不需要转义:
spawn ssh -o "StrictHostKeyChecking no" "me@$1"
如上所述,log_file
会记录会话的记录。只是为了记录特定的消息,你可以使用普通的Tcl:
/usr/bin/expect <<EOF
proc log_msg {msg {to_stdout no}} {
set log_line "[timestamp -format {[%Y-%m-%d %T]}] \$msg"
set fh [open ~/mylogfile.log a]
puts \$fh \$log_line
close \$fh
if {\$to_stdout} {puts \$log_line}
}
# ...
expect {
"No route to host" {
log_msg "No route to host" yes
exit 1
}
timeout { log_msg "Timed out to $1"]; exit 1 }
}
# ...
EOF
这会打开和关闭每条消息的日志,这会增加一些开销。如果毫秒很重要,请在全局范围中打开日志,并在log_msg proc中使用保存文件hendle的全局变量。