【问题标题】:Bash Script Doesn't run properly when closing the terminal关闭终端时 Bash 脚本无法正常运行
【发布时间】:2021-01-20 03:12:36
【问题描述】:

当我执行exit 命令时,以下 Bash 脚本运行正常。

#!/bin/bash
user=$(echo $(who am i) | awk '{print $1" "$5" "$3" "$4}')
formattedUser=$(echo $user | tr -d '()')
finalData=$formattedUser" to "$(date +"%Y-%m-%d")" "$(date +"%H:%M")
logoutTime=$(date +"%m/%d/%Y %H:%M")":00"
startDate=$(echo $(who am i) | awk '{print $3}')
startDateFinal=$(echo $startDate | tr '-' '/')
startTime=$(echo $(who am i) | awk '{print $4}')
startTimeFinal=$startTime":00"
loginTime=$startDateFinal" "$startTimeFinal

function diff_seconds {
    var1=$(date "+%s" -d "$1");
    var2=$(date "+%s" -d "$2");
    period=$(( $var1 - $var2 ));
}

diff_seconds "$logoutTime" "$loginTime"
periodMins=$(echo $(( period / 60 )))
finalDataToLog=$finalData" "$periodMins
echo $finalDataToLog | tee -a /home/amantha/log-sources/logout.log
chmod 777 /home/amantha/log-sources/logout.log

我在.bashrc 中包含了上面的 bash 脚本。

trap /home/amantha/log-sources/logout.sh EXIT

你可以看到下面的输出。

amantha 192.168.1.36 2020-10-05 10:29 to 2020-10-05 10:31 2

第一个字段 - 用户 第二个字段 - 用户 ip 第三个字段 - 登录日期 第四个字段 - 登录时间 第 5 档 - “到”字 第 6 个字段 - 注销日期 第 7 场 - 登出时间 第 8 个字段 - 时间段

问题是当我关闭终端时它不能正常工作。 输出:

to 2020-10-05 10:28 0

我这样做的目的是确定用户使用 ssh 登录和注销的时间。你有什么解决办法吗? 以上一个仅适用于退出命令。当我关闭终端或连接失败时,它无法正常工作。

【问题讨论】:

  • 您可能有兴趣使用文件~/.bash_logout 这是man bash 必须说的: 当登录shell 退出时,bash 从文件中读取并执行命令 ~/.bash_logout和 /etc/bash.bash_logout,如果文件存在。
  • @kvantour :虽然这肯定比使用 EXIT 陷阱 更有意义,但 OP 希望在 关闭终端时执行脚本我>。我认为 bash 不会通过优雅的注销来处理。相反,它会被一些信号杀死。
  • @Amantha :要使其工作,您需要在关闭终端时捕获终端发送到 bash 的信号。

标签: bash shell ubuntu ssh terminal


【解决方案1】:

您正在尝试解决已解决的问题。

如果您使用的是 RHEL/CENTOS/Fedora。用户的日志存储在:

/var/log/wtmp – Logs of last login sessions
/var/run/utmp – Logs of the current login sessions
/var/log/btmp – Logs of the bad login attempts

还有last 命令。 这是有据可查的here。 这是一个很好的article 解决您的问题。

【讨论】:

  • 我支持这个。用户可以轻松修改他的 initfiles 以删除此信息,即使您将其放在 /etc/bashrc 中。使用系统日志接口(使用last)更安全。
  • 我在 ubuntu 中执行此操作... last 命令显示用户列表.. 我想捕获最后一个注销的用户并写入文件...有什么想法吗?
  • @Amantha 为什么要记录此信息,如果它已被记录。可以随时使用命令last 提取所有信息。此命令保留完整的历史记录。有关详细信息,请参阅man last。示例:last -F -n 2 amantha 将给出用户 amantha 的最后登录和注销时间。它还会告诉用户是否仍然登录。
  • 我想将这些数据发送给麋鹿......使用自定义日志很容易完成这项任务......我想要下面的字段。 1. 用户 2. ipaddress 3. 登录日期和时间 4. 注销日期和时间.. 5. 会话持续时间..
  • @Amantha,从last 命令输出生成您的自定义日志。使用单个 awk 脚本来处理时间差异。 last | awk '{gsub("[()]","");print $1" "$NF}'
猜你喜欢
  • 2019-07-17
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2014-08-13
相关资源
最近更新 更多