【发布时间】:2011-10-21 01:26:21
【问题描述】:
除了作为 HISTFILE 提到的默认文件之外,是否可以将特定用户的历史记录保存在多个文件中? 如果主文件被删除,我希望将其作为备份文件,并让它成为那个文件的备份。
问候, 斯里哈莎·卡鲁鲁。
【问题讨论】:
-
我认为这是 bash shell,你能确认一下吗?
-
抱歉回复晚了。是的,它是一个 bash shell。
标签: linux
除了作为 HISTFILE 提到的默认文件之外,是否可以将特定用户的历史记录保存在多个文件中? 如果主文件被删除,我希望将其作为备份文件,并让它成为那个文件的备份。
问候, 斯里哈莎·卡鲁鲁。
【问题讨论】:
标签: linux
您可以创建文件的硬链接
cp --link --verbose /home/$USER/.bash_history /somewhere/else/users_history
当他家中的原始文件被删除时,文件仍然存在并且内容不会丢失。
【讨论】:
很多时候我发现自己在 Bash 中使用 Ctrl-R 来获取一个四倍于终端宽度的旧命令,只是为了发现已经过去了太多天并且它不再在 .bash_history 文件中。这里有两行将跟踪您在 bash 提示符下键入的每个命令行,并且根本不使用任何外部进程,只是简单的 bash。
我解决这个问题的第一个方法是将历史记录中的最大行数增加到一个非常大的数量。但不管它有多大,总有那么一刻我需要一个很长的命令,我在几个月前就输入了它,它已经离开了历史。当我了解 PROMPT_COMMAND 变量时,我想到了当前的解决方案,这是 bash 在显示每个提示之前执行的命令。这是两行:
export HISTTIMEFORMAT="%s "
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND ; }"'echo $$ $USER \
"$(history 1)" >> ~/.bash_eternal_history'
我为自己设定的一个目标是在不使用任何外部进程的情况下实现它,因此 bash 不必在每次按 ENTER 后派生一个新进程。第一行设置历史行的格式以包含日期作为 Unix 时间戳,因此您现在可以在键入每个命令时。第二行是解决方案的核心,首先确保如果之前设置了 PROMPT_COMMAND,它会在我们的内容之前执行,然后附加一行格式:
PID USER INDEX TIMESTAMP COMMAND
到当前用户主目录中名为 .bash_eternal_history 的文件。
添加用户名,起初似乎没有必要,后来在区分“sudo -s”会话和为“~/”保留相同值的普通会话之间变得有用,因此将行附加到相同的 .bash_eternal_history 文件。
我希望你们中的一些人发现这两行代码和我一样有用。 :-)
【讨论】:
hard links 能解决你的问题吗?
您也可以阅读手册页here。
【讨论】:
我会编写一个 cronjob,每隔一分钟左右将原始 histfiel 复制到备份位置。您不必担心定义第二个历史文件。 否则您可以将用户输入的每个命令写入备用文件 对于这种方法,请看这里:
bash, run some command before or after every command entered from console
【讨论】: