![有没有办法确定哪个用户在 bash 历史记录中运行了命令?](https://linux22.com/image/1439364/%E6%9C%89%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%E7%A1%AE%E5%AE%9A%E5%93%AA%E4%B8%AA%E7%94%A8%E6%88%B7%E5%9C%A8%20bash%20%E5%8E%86%E5%8F%B2%E8%AE%B0%E5%BD%95%E4%B8%AD%E8%BF%90%E8%A1%8C%E4%BA%86%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
我们在 CentOS 服务器上工作,一百多名员工可以通过 SSH 使用这些服务器,每个员工都有自己的登录名。运行常规history
bash 命令会显示所有员工运行的所有命令,但不会指定哪个员工运行了该命令。是否可以让历史记录不仅显示运行的 bash 命令,还显示哪个 SSH 用户运行了该命令?
答案1
看起来您希望对系统进行更全面的审核,但是对于 Bash 和历史记录,您可以启用时间戳。这与 last 命令和定制的 grep 结合使用,应该有助于确定哪个特定用户执行了犯罪。呃,命令。
- 启用历史时间戳。
来自 GNU 的 Bash 页面:
如果设置了此变量且不为空,则其值将用作 strftime 的格式字符串,以打印与内置 history 显示的每个历史记录条目相关联的时间戳。如果设置了此变量,则时间戳将写入历史文件,以便它们可以在 shell 会话之间保留。这使用历史注释字符将时间戳与其他历史记录行区分开来。
- 使用最后一个命令
最后将显示用户登录/注销时间。这会将您的搜索范围缩小到几个用户。
- grep 上面匹配的特定命令的特定用户。
就像是:
grep "command" /home/{user_a,user_b}/.history
请注意,历史文件将包含时间戳的附加数据,但在文本中仍然非常易读。
- 创建一个 Bash 函数来执行上述所有操作
创建一个函数 histuser(),它将接受一个参数:命令名称,并执行上述搜索并返回特定用户的名称。如果您希望完成此操作,请给我发电子邮件。我很容易,但不便宜。
答案2
你可以尝试一下
cat /home/user_you_are_looking_for/.bash_history
答案3
根据“Unix & Linux Stack Exchange” 网站上的这个答案你可以使用getent
滚动浏览每个用户的主目录并在该输出中搜索命令/模式:
getent passwd |
cut -d : -f 6 |
sed 's:$:/.bash_history:' |
xargs -d '\n' grep -H -e "[command/pattern you are looking for]"
或者你可以使用grep
搜索所有 bash 历史记录,如下所示:
grep -e "[command/pattern you are looking for]" /home/*/.bash_history
答案4
一个名为 SSHLog 的新项目(https://github.com/sshlog/agent/) 最近发布,记录每个登录用户的历史记录。完整的终端历史记录将作为每个用户的一个文件记录在 /var/log/sshlog 中。
还有一个摘要日志文件,按用户帐户报告用户会话命令。例如:
2023-04-19 12:28:30 command_start (2811756) john executed /usr/bin/locale-check C.UTF-8
2023-04-19 12:28:32 command_finish (2811756) john execute complete (exit code: 0) /usr/bin/locale-check C.UTF-8
2023-04-19 12:28:32 command_start (2811756) sara executed /usr/bin/flatpak --installations
2023-04-19 12:28:34 command_finish (2811756) sara executed (exit code: 0) /usr/bin/flatpak --installations