如何使Bash历史记录无法被删除?

Bash历史记录可以通过删除包含的文件来删除。如何保护历史记录不被清除/删除?

2正如答案所示,该系统本身没有这种功能。如果您确实需要一种不可删除的记录历史的方法,请考虑使用外部硬件和修改过的bash可执行文件(例如自动将所有命令记录到外部存储设备中的一个版本,该设备无法在没有物理访问权限的情况下被删除,例如外部数据记录器、正确配置的Arduino作为串行端口(写入SD卡)、您信任的网络服务器,甚至是打印纸带)。 - nanofarad
虽然这不是对问题的回答,但一个强制脚本命令可能有助于解决你的整体问题。请访问以下链接以了解更多信息:https://www.ibm.com/developerworks/community/blogs/nix/entry/the_unix_script_command_a_command_recorder2?lang=zh - Carl
只是为了使历史文件更难找到,你可以将它重命名为以“.”开头的名称,并将其权限设置为“000”。 - boardrider
1@boardrider 那样的话,Bash 就无法记录任何历史了。 - Dessa Simpson
2这是一个XY问题。无论你希望达到什么目标,都可能有一种方法可以实现。但它与bash历史没有任何关系。 - David Schwartz
5个回答

你所询问的可以通过...来完成。
sudo chattr +a ~$USER/.bash_history
sudo chattr +i ~$USER/.profile

这将为.bash_history设置“仅追加”属性,并为.profile设置“不可变位”,即使是root用户也无法删除或截断该文件,除非移除了该位。第二个命令防止用户编辑.profile的设置。
接下来将此内容放入/etc/bash.bashrc/etc/.profile中:
# #Prevent unset of histfile, /etc/profile
HISTFILE=~/.bash_history
HISTSIZE=10000
HISTFILESIZE=999999
# Don't let the users enter commands that are ignored# in the history file
HISTIGNORE=""
HISTCONTROL=""
readonly HISTFILE
readonly HISTSIZE
readonly HISTFILESIZE
readonly HISTIGNORE
readonly HISTCONTROL
export HISTFILE HISTSIZE HISTFILESIZE HISTIGNORE HISTCONTROL

那会锁定大多数用户可能犯错的简单操作。但对于更有经验的用户来说,这并不能阻止他们...
  • 用户可以简单地切换到另一个shell,你将看不到任何记录。
  • 任何具有管理员密码或具有CAP_LINUX_IMMUTABLE权限的进程都可以删除不可变位。
  • 默认以空格开头的命令不会被存储在历史记录中。
  • 你无法停止kill -9 $$这个命令。该命令将阻止写入历史记录。

所以你所问的是毫无意义的。如果你不信任用户,请不要让他们进入你的系统。

如果这个问题是为了追踪黑客的行为...你可以完全忘记这一点;当他们使用你的系统时,他们不太可能使用bash,而且这个历史记录只适用于bash。

一个更优越的选择是使用grsecurity或安装acct(GNU会计工具)。


2一点也不。你可以通过不让别人安装它们来防止rootkit的出现。坚持使用从Ubuntu软件中心获取的软件,不要随意从网上下载软件。如果你从可信的来源下载软件,你永远不会遭到rootkit的侵袭。 - Rinzwind
1@Tomas 别忘了,我们这里没有"话题"。我们不是一个论坛;这里有"问题"(questions),"回答"(针对这些问题的回答)和"评论"(小型额外问题,修改或相关信息)。你以提问的方式询问链接的问题是正确的做法,但尽量不要在Stack Exchange网站上使用论坛术语(这会惹恼一些人)。 - wizzwizz4
那样做会导致Bash无法写入日志吗?另一个问题说:“你无法防止被删除。如果将权限位设置为只读,Bash将无法写入其中。” - bb216b3acfd8f72cbc8f899d4d6963
@花生 我把它改成了"+a"。 - Rinzwind
+i = 不可变,防止所有更改; +a = 仅追加。两者均适用于特定的文件系统。 - ilkkachu
@Peanut 那是我。在进行其他修改时,错误地使用了+i - heemayl
现在我在工作,有更多的工具可以检查,所以我又添加了一点内容:D - Rinzwind
@heemayl,我还以为我疯了呢。我确定在制作时加了“+a” :D :D 你编辑后有人给我点了踩 >:-D - Rinzwind
Rinz,哈哈..对不起啦。可能是在做其他事情时,肌肉记忆作祟了 :) - heemayl

这不是你想要的答案,但你真正想要的是Linux的审计系统,而不是Bash。审计系统专门设计用于此类事情,而Shell历史记录只是一个方便的功能,有许多方法可以修改它或简单地不使用它,正如许多答案中所述。

你无法保护.bash_history文件免于被删除。如果将其权限位设置为只读,bash将无法写入其中。
然而,你可以在~/.bashrc中为rm创建一个别名,这样每次你想要删除东西时,它都会询问你是否确定(y/n)
将以下行添加到你的~/.bashrc文件中。
alias rm="rm -i"

还要确保只有你自己能够读写那个文件。
chmod 600 ~/.bashrc

应该能完成任务。

不是为了防止删除本身,而是为了保留备份的一种方法是将~/.bash_history保存在Dropbox中并创建符号链接。我猜还有其他备份软件可以以不同的方式持续进行备份。

你可以设置/etc/skel/.bashrc或每个用户的~/.bashrc
readonly HISTFILE
readonly HISTFILESIZE
readonly HISTSIZE
readonly HISTCMD
readonly HISTCONTROL
readonly HISTIGNORE