![将 bash_history 写入带有时间戳的文件](https://linux22.com/image/68496/%E5%B0%86%20bash_history%20%E5%86%99%E5%85%A5%E5%B8%A6%E6%9C%89%E6%97%B6%E9%97%B4%E6%88%B3%E7%9A%84%E6%96%87%E4%BB%B6.png)
要求是在执行命令时将命令行历史记录捕获到具有特定命令日期和时间的文件中。
下面的脚本捕获带有日期和时间的历史记录,但它也为旧命令分配当前日期和时间。另外,我想扩展脚本以对历史输出文件进行增量备份。
#!/bin/bash
. ~/.bash_profile
HISTFILE=~/.bash_history
set -o history
history >/home/user/hist_`date "+%d%b%y%T"`
答案1
不完全是您想要的,但您可以bash
自动向历史记录中的每一行添加时间戳。简单设置,例如:
HISTTIMEFORMAT="%d%b%y%T "
命令history
没有参数然后将显示您的历史条目,如下所示:
23Jul1515:48:14 ls -ld .
然而该history -w
命令总是写入历史文件在内部格式中的:
#1437659315
ls -ld .
即在 2 行中,第一行以秒为单位保存“自纪元以来”(即 1970 年 1 月 1 日)的时间,#
前面带有 a,这样就不会与命令混淆。
答案2
在 bash 中,有一个选项指示 bash 记录每个命令的时间戳。您可以通过为环境变量分配一个有用的值来完成此操作HISTTIMEFORMAT
。从bash
联机帮助页:
如果此变量已设置且不为空,则其值将用作格式字符串,用于
strftime(3)
打印与内置历史记录显示的每个历史条目关联的时间戳。如果设置了此变量,时间戳将写入历史文件,以便可以跨 shell 会话保留它们。这使用历史注释字符来区分时间戳和其他历史行。
请注意,激活后HISTTIMEFORMAT
,~/.bash_history
每个记录的命令始终有两行:
- 第一个行以井号“#”符号开头,紧接着是 Unix 时间戳(自 Unix 纪元开始以来的秒数)。
- 第二行是您键入的命令。
#1671097644 cd ~/bin #1671097645 ls -l
在我的环境中,我使用
HISTTIMEFORMAT="%s (%H:%M:%S):"
当您调用history
该工具时,使用您定义的格式动态格式化时间戳。我使用上面的格式,以便命令可以轻松排序(%s
时间戳以秒为单位)并且易于阅读。在我的 shell 中,当我输入 时history
,我会看到类似以下内容:
3 1437664568 (17:16:08):man bash
4 1437664699 (17:18:19):history
笔记:激活时间戳记录之前的所有命令都只是没有前缀时间戳行的命令。因此,它们会显示您登录当前会话时的日期/时间戳。如果这让您烦恼,那么只需查找/替换您的旧行,并在它们前面添加一个人工时间戳即可。并在边界线上添加注释以供记录之用。像这样:
#1671058800
ls -l
#1671058800
exit
#1671094600
echo Activated timestamp recording in the history file now.
#1671094610
echo All commands prior got the artificial timestamp 2022-12-15 00:00:00 (1671058800).
#1671094622
cd /
#1671094627
exit
编辑:操作员的问题没有完全回答。
我还想扩展脚本以对历史输出文件进行增量备份
我不确定历史文件的“增量备份”是什么意思。也许您只是希望定期备份历史记录。您可以采取以下几种方法:
- 设置 PROMPT_COMMAND 变量以
history -a
在每次调用后不断更新历史命令(而不是等待注销)。 - 使用您定义的函数捕获 DEBUG 信号。每次输入命令时,都会调用该函数。在函数内部你可以做任何事情。 (比 PROMPT_COMMAND 稍微可靠一些)。
- cronjob 定期复制/归档历史文件。