有没有办法确定哪个用户在 bash 历史记录中运行了命令?

有没有办法确定哪个用户在 bash 历史记录中运行了命令?

我们在 CentOS 服务器上工作,一百多名员工可以通过 SSH 使用这些服务器,每个员工都有自己的登录名。运行常规historybash 命令会显示所有员工运行的所有命令,但不会指定哪个员工运行了该命令。是否可以让历史记录不仅显示运行的 bash 命令,还显示哪个 SSH 用户运行了该命令?

答案1

看起来您希望对系统进行更全面的审核,但是对于 Bash 和历史记录,您可以启用时间戳。这与 last 命令和定制的 grep 结合使用,应该有助于确定哪个特定用户执行了犯罪。呃,命令。

  1. 启用历史时间戳。

来自 GNU 的 Bash 页面:

历史时间格式

如果设置了此变量且不为空,则其值将用作 strftime 的格式字符串,以打印与内置 history 显示的每个历史记录条目相关联的时间戳。如果设置了此变量,则时间戳将写入历史文件,以便它们可以在 shell 会话之间保留。这使用历史注释字符将时间戳与其他历史记录行区分开来。

格式化时间字符串的参考

  1. 使用最后一个命令

最后将显示用户登录/注销时间。这会将您的搜索范围缩小到几个用户。

  1. grep 上面匹配的特定命令的特定用户。

就像是:

grep "command" /home/{user_a,user_b}/.history

请注意,历史文件将包含时间戳的附加数据,但在文本中仍然非常易读。

  1. 创建一个 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

相关内容