如果我以 身份登录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 vipw
或sudo bash
,但我无法看到他们在 生成的 shell 中调用的命令sudo bash
。有一些解决方案可能会有所帮助 (例如auditd
),但您需要事先设置它们。
答案3
history
是 bash 内置的,可以检索:
- 在此 bash 会话中发出的命令(因此对于最近的命令,它必须从发出命令的 shell 进程运行)。
- 先前发出的命令,终止会话,使用
~/.bash_history
文件。这假设这些命令已保存在历史记录中(但可以通过取消设置 HISTFILE 变量来禁用此功能(*))。此外,据我所知,当前会话的历史记录仅附加到历史文件中当 shell 退出时。
换句话说,查看历史文件只能提供过去一段时间内发出的命令,而无法看到当前正在运行的会话中发出的命令。
(*)实际上,这样做不会有太大的惩罚,大多数命令检索都是针对当前会话中发出的命令。