history隐藏历史命令记录的小技巧
不能删除所有的命令记录,需要确保操作是有记录的,但是执行的部分命令又不想被别人知道orz。
试想这样一种场景?
不记录历史命令执行
set +o history //设置命令不记录进history set -o histoty //设置命令记录进history
以下图为例,记录了最近执行的历史命令。
使用history -d 删除指定命令记录
history n //显示最近n条历史命令记录 history -d n //删除第n条命令记录
这种方式过于明显,删除的操作也被记录进去。
编辑 ~/.bash_history 文件删除历史记录
这里有两种方式生效:
1、需要执行history -w 将内存的记录写入文件
2、断开shell后会自动将内存的记录写入文件
同理可以手动编辑 ~/.bash_history 删除历史记录。
但是通过这种方式删除历史命令,只要当前shell没有断开,history看到的还是没有删除的状态,这是为什么呢?
参考 图-history 执行过程
与上面同理:
1、执行history -r 从文件读取到内存中
2、下次新起shell后会将文件读取到内存中
使用sed命令快速删除的技巧
比如前3868行是用户的正常操作记录,3868以后是恶意的操作记录。我们可以只保留正常的操作,删除不必要痕迹的历史操作记录,这里,我们只保留前150行:
执行命令前加入空格(部分可用)
[root@VM-8-4-centos ~]# [space] command // [space]表示空格
测试时使用的是腾讯云的centos,是改过/etc/bashrc系统配置。因此在部分系统上是可用的,如果不生效则需要修改bashrc使这种方式生效。
echo HISTCONTROL=ignorespace >> ~/.bashrc
source ~/.bashrc
chattr +ai .bash_history 不记录后续历史记录
这种方式比较hack,通过给.bash_history文件加入特殊权限(不可编辑和追加),使history命令看到的记录永远都是一致的。
chattr +ai ~/.bash_history
这样history永远都只有执行 chattr +ai .bash_history 命令之前的历史记录(下次新起shell时还是先读取.bash_history文件到内存中)。这种方式使内存中的记录无法成功写入文件,从而达到隐藏命令记录的效果。
在下次新打开一个shell的情况下,重启启用历史记录可执行下面的命令恢复。
chattr -ai .bash_history
隐藏ssh登录记录(补充)
虽然隐藏了history执行命令的记录,但是从ssh登录的记录依然可以看到对应的时间段有ssh连接执行过程操作。
下面的方式可以隐藏ssh的登录记录,不会被w、last等指令检测到。
ssh -T root@目标ip /bin/bash -i
但是/var/log/secure日志中还是能检测到。所以最好干掉ssh日志中包含对应连接ip的记录。
sed -i '/.*192.168.0.1.*/d' /var/log/secure
删除指定ip在ssh日志中的记录。
中断ssh会话实现记录隐藏
在退出前执行
kill -9 $$
使用 kill -9 $$
断开 SSH 连接后,之前操作的命令记录无法写入到 .bash_history
文件中。这是因为 kill -9
会强制终止 shell 进程,导致 shell 无法执行任何清理工作或写入历史记录。
一般情况下,命令历史记录在 shell 会话正常退出(例如通过 exit
或按 Ctrl+D
)时会写入到 .bash_history
文件中。当 shell 被强制终止时,当前会话的命令历史记录将不会被保存。
注意,如果.bashrc中配置了下面的命令
export PROMPT_COMMAND="history -a; $PROMPT_COMMAND"
这种方式就是无效的,这条命令的意思是将记录实时写入到文件中,kill -9 $$中断会话前所有的记录已经写入文件了。
总结
上面总结的6种方式都可以实现对部分history命令记录的隐藏,但是最推荐的还是直接编辑 .bash_history 文件的方式实现,毕竟linux下一切皆文件(本质)。
赞赏微信赞赏支付宝赞赏
2条评论