脚本未记录到日志文件。为什么?

时间:2014-05-09 11:11:20

标签: bash tcl expect

我有一个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

有什么想法吗?

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的全局变量。