install_monitor_user_command_bash.sh 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. #!/bin/bash
  2. # 监控用户命令
  3. cat >> ~/.bashrc << 'EOB'
  4. # ============= 监控用户命令 =============
  5. # preexec 函数,在命令执行前调用
  6. preexec() {
  7. local command="$BASH_COMMAND"
  8. # 忽略内部命令
  9. if [[ "$command" == "precmd" || "$command" == "preexec_invoke_exec" ]]; then
  10. return
  11. fi
  12. local timestamp=$(date "+%Y-%m-%d %H:%M:%S")
  13. local user=$(whoami)
  14. local cwd=$(pwd)
  15. echo "$timestamp - $user - $cwd - START: $command" >> /tmp/users-command.log
  16. }
  17. # precmd 函数,在命令执行后调用
  18. precmd() {
  19. local exit_code=$?
  20. local last_command=$(HISTTIMEFORMAT= history 1 | sed 's/^ *[0-9]\+ *//')
  21. local timestamp=$(date "+%Y-%m-%d %H:%M:%S")
  22. local user=$(whoami)
  23. local cwd=$(pwd)
  24. echo "$timestamp - $user - $cwd - END: $last_command [exit code: $exit_code]" >> /tmp/users-command.log
  25. }
  26. # 设置 preexec 功能
  27. preexec_invoke_exec() {
  28. [ -n "$COMP_LINE" ] && return # 如果是补全命令,则不执行
  29. preexec "$(history 1 | sed 's/^ *[0-9]\+ *//')"
  30. }
  31. trap 'preexec_invoke_exec' DEBUG
  32. # 设置 precmd 功能
  33. PROMPT_COMMAND="precmd; $PROMPT_COMMAND"
  34. # ============= 监控用户命令 =============
  35. EOB
  36. echo "安装完成: source ~/.bashrc ,请查看:/tmp/users-command.log"