如何从 root 查看普通用户的历史记录

如何从 root 查看普通用户的历史记录

如果我以 身份登录root,我将如何查看其他用户的历史记录。我尝试使用,su -c但历史记录命令为空,例如,如果我从 root 运行以下命令

root@server:#su -c 'who am i' user1

user1 pts/0        2019-08-12 10:30

root@server:#su -c 'history' user1

该命令不返回任何内容。

我想查看用户历史记录的时间戳,这仅通过查看是不可能实现的/home/user1/.bash_history,这就是为什么我想使用历史命令来获取带有时间戳的输出。

答案1

bash 默认存储命令历史记录的唯一位置是.bash_history,并且它不会在该文件中存储时间戳。从历史文件加载历史记录时,它将全部加载 shell 启动时的时间戳。

我不太清楚为什么运行history不起作用su,但这是一个没有实际意义的问题。你看不到任何无法通过直接查看用户历史文件获得的信息。

答案2

我想查看用户历史记录的时间戳,而这仅靠查看/home/user1/.bash_history

时间戳可能存在于此文件中,也可能不存在于此文件中。其他地方不存在(除非用户故意使用其他文件;我假设您找到了正确的文件)。来自man 1 bash

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

如果user1设置了变量并且不为空(例如HISTTIMEFORMAT="%F %T: "),则中的条目/home/user1/.bash_history将如下所示:

#1568346641
ls -hls /

其中数字1568346641是“自 以来的秒数1970-01-01 00:00:00 UTC”(如 中所示date +%s,请参阅man 1 date)。这些是您要查找的时间戳。如果文件中没有此类条目,则为时已晚:时间戳信息尚未保存,它已经消失了。


实际上你可能需要运行这个:

# as root
cp /home/user1/.bash_history /root/user1_history
chmod -w /root/user1_history
HISTFILE="/root/user1_history"
HISTTIMEFORMAT="%F %T: "
history -c
history -r
 history | less

(最后一个命令以空格开头,因此它不会存储在您将要看到的当前历史记录中)。

如果文件中有时间戳,那么您将以人类可读的形式看到它们(根据HISTTIMEFORMAT我们使用的格式)。缺少的时间戳将替换为您当前 shell 的启动时间,您对此无能为力。


注意/home/user1/.bash_history并不是查看用户所做操作的可靠方法。用户可能执行了以下操作:

  • 使用另一个 shell,
  • 使用另一个文件,
  • 选择不保存文件,
  • 使 shell 无法记住某些命令,
  • 植入“伪造”文件。

根据您想要查找的内容,也许您会幸运地找到/var/log/auth.log(Debian 和类似版本) 或/var/log/secure(我相信是其他一些发行版)。在我的 Debian 中,我可以在日志中看到谁 (以及何时) 执行了sudo vipwsudo bash,但我无法看到他们在 生成的 shell 中调用的命令sudo bash。有一些解决方案可能会有所帮助 (例如auditd),但您需要事先设置它们。

答案3

history是 bash 内置的,可以检索:

  • 在此 bash 会话中发出的命令(因此对于最近的命令,它必须从发出命令的 shell 进程运行)。
  • 先前发出的命令,终止会话,使用~/.bash_history文件。这假设这些命令已保存在历史记录中(但可以通过取消设置 HISTFILE 变量来禁用此功能(*))。此外,据我所知,当前会话的历史记录仅附加到历史文件中当 shell 退出时

换句话说,查看历史文件只能提供过去一段时间内发出的命令,而无法看到当前正在运行的会话中发出的命令。

(*)实际上,这样做不会有太大的惩罚,大多数命令检索都是针对当前会话中发出的命令。

相关内容