区分退出和会话超时

Differentiate between exit and session timeout

我有以下要求:

那些审计日志一定是不同的。我正在玩以下脚本 trap.sh:

export TMOUT=10

function handle-timeout {
    echo "Timeout"
}

function handle-exit {
    echo "Exit"
}

trap handle-exit EXIT

现在如果我这样做:

valegon@precision ~ (master) $ bash
valegon@precision ~ (master) $ source trap.sh
valegon@precision ~ (master) $ exit
Exit

它按预期工作。相反,我等待超时发生:

valegon@precision ~ (master) $ bash
valegon@precision ~ (master) $ source trap.sh
valegon@precision ~ (master) $ timed out waiting for input: auto-logout
Exit

这里有两个问题:

  1. 超时正在触发 EXIT,这是我不想要的
  2. 我不知道如何具体捕获超时

我该如何解决这些悬而未决的问题?

Distinguish between user logout and session expired logout (SSH and web console)

我发布的答案与我在此处发布的答案相同。

...

对于将有登录事件的普通会话,您可以在 'EXIT' 事件上设置陷阱。这将涵盖显式注销(CTRL/D,或退出)、被信号杀死(不是信号 9)和超时。寻找 bash 'trap' 命令。这些可以在 loginn 启动脚本中设置 (bashrc)

编辑

可以通过检查“$?”来获得 'TIMEOUT' 的指示在 TRAP 处理程序中。它将是 142 对应于 ALRM 信号 (kill -l 142=ARLM)。这不是明确的文档,但与 kill -ALRM 的默认信号处理程序一致。

function my_trap {
  local X=
  if [ "$X" = "$(kill -l ALRM)" ] ; then
     Log Timeout
  else
     Log Exit/EOF
  fi
}

trap 'my_trap $?' EXIT

第二次尝试

根据反馈,之前在 EXIT 上使用陷阱的解决方案效果不佳。替代方案,基于使用 PROMPT_COMMAND 似乎可以提供更好的里程数。

基本逻辑:

  • 捕获命令提示时间-开始)
  • 在 'exit' 事件中,检查是否(现在开始)> TMOUT
  • 正常情况下,退出,CTRL/D等会在1-2秒内完成。
#! /bin/bash
function pre_cmd {
        START=$SECONDS
}

function log_exit {
    if [ "$((SECONDS-START-TMOUT))" -ge 0 ] ; then
       echo "TIMEOUT"
    else
       echo "Normal Exit"
    fi
}

TMOUT=15
PROMPT_COMMAND=pre_cmd
trap 'log_exit' EXIT