区分退出和会话超时
Differentiate between exit and session timeout
我有以下要求:
- 当 bash 会话已被用户终止(退出)时生成审核日志
- 在 bash 会话超时时生成审核日志
那些审计日志一定是不同的。我正在玩以下脚本 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
这里有两个问题:
- 超时正在触发 EXIT,这是我不想要的
- 我不知道如何具体捕获超时
我该如何解决这些悬而未决的问题?
同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
我有以下要求:
- 当 bash 会话已被用户终止(退出)时生成审核日志
- 在 bash 会话超时时生成审核日志
那些审计日志一定是不同的。我正在玩以下脚本 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
这里有两个问题:
- 超时正在触发 EXIT,这是我不想要的
- 我不知道如何具体捕获超时
我该如何解决这些悬而未决的问题?
同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