首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >区分退出和会话超时

区分退出和会话超时
EN

Stack Overflow用户
提问于 2019-10-22 11:08:58
回答 2查看 1.3K关注 0票数 4

我有以下要求:

当用户终止bash会话时,

  • 生成审计日志,当bash会话超时

时,

  • 生成审计日志。

这些审计日志必须不同。我正在使用下面的脚本trap.sh

代码语言:javascript
复制
export TMOUT=10

function handle-timeout {
    echo "Timeout"
}

function handle-exit {
    echo "Exit"
}

trap handle-exit EXIT

如果我这么做了:

代码语言:javascript
复制
valegon@precision ~ (master) $ bash
valegon@precision ~ (master) $ source trap.sh
valegon@precision ~ (master) $ exit
Exit

它如预期的那样工作。如果相反,我等待超时发生:

代码语言:javascript
复制
valegon@precision ~ (master) $ bash
valegon@precision ~ (master) $ source trap.sh
valegon@precision ~ (master) $ timed out waiting for input: auto-logout
Exit

这里有两个问题:

  1. 超时正在触发退出,我不希望
  2. --我不知道如何捕获超时值

我怎样才能解决这些悬而未决的问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-22 18:58:36

第二次尝试

基于反馈,以前在出口处使用陷阱的解决方案不能很好地工作。基于使用PROMPT_COMMAND的替代方案似乎提供了更好的里程。

基本逻辑:

在“退出”事件中,检查(现在开始)> TMOUT

  • Normally,退出、CTRL/D等是否将在1-2秒内完成。

代码语言:javascript
复制
#! /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
票数 3
EN

Stack Overflow用户

发布于 2019-10-22 12:45:56

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

我发的答案和我在那里发的一样。

..。

对于具有登录事件的普通会话,您可以在“退出”事件上设置一个陷阱。这将包括显式注销(CTRL/D,或exit)、被信号杀死的gettng (不是信号9)和超时。找巴什“陷阱”命令。它们可以在loginn启动脚本(bashrc)中设置。

编辑

通过检查“$?”可以获得“超时”的指示。在陷阱处理程序中。它将是142个对应于ALRM信号(杀死-l 142=ARLM)。这不是显式文档,但与杀死-ALRM的默认信号处理程序一致。

代码语言:javascript
复制
function my_trap {
  local X=$1
  if [ "$X" = "$(kill -l ALRM)" ] ; then
     Log Timeout
  else
     Log Exit/EOF
  fi
}

trap 'my_trap $?' EXIT
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58502915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档