SSH 操作痕迹清理
正常使用 ssh 连接服务器进行操作会产生很多痕迹,比如 ~/.bash_history, /var/log/wtmp,和 /var/log/laslog。某些情况下需要只清理一部分的记录,这里整理一些自己用到的方法。
.*_history
tldr
export HISTSIZE=0
# or
unset HISTFILEexport HISTSIZE=0 会将当前会话的历史记录长度设置为 0。这个方法唯一的弊端就是比较折磨我这种喜欢按方向键找命令的人。
所以比较推荐unset HISTFILE,会话结束时系统会将操作记录写入 HISTFILE 指向的文件,这个变量不存在时自然就不写入了,但缓冲区里仍然会保存你这个会话执行过的命令。
另外需要注意的是,像
Redis-clipsql等 CLI 都会在用户根目录下保存操作记录。
常见误区
首先要明确,直接使用 history 命令读取的是缓冲区,在 session 结束或者执行history -w来进行写入后对文件的修改才会完成。
清除缓冲区所有记录:
history -c其他常见方法: 在一个 session 中临时停止记录
set +o history; # 临时停止记录
# 这些命令都不会被记录
set -o history; # 恢复记录需要注意的是这条命令本身会被记录,一般的规避方式在命令前添加空格。 而想要利用空格规避记录,还需要确保 env 中 HISTCONTROL=ignorespace
set HISTCONTROL=ignorespace:$HISTCONTROL或者直接使用 vim / nano 去修改 .bash_history,不过还是同样的,这样仅仅修改了本地文件,在会话结束后仍会将编辑记录写回文件。
有些小白(以前的我)会用上面两种方法去清除痕迹,其实属于掩耳盗铃。
wtmp
tldr
utmpdump /var/log/wtmp | head -n -1 > /tmp/t ;
utmpdump -r /tmp/t > /var/log/wtmp ; rm -f /tmp/t ;利用 utmpdump 将 wtmp 的内容读取后剔除最后一行写入临时文件,再从临时文件读入 wtmp,最后删除临时文件。
/var/log/wtmp 存储的是用户成功登录的记录,一个完整的会话会有两条记录,一条登入;一条登出。利用命令 last 会从这个文件里查询记录。
下面是一个利用 utmpdump 导出的日志示例:
[7] [27082] [ts/0] [root ] [pts/0 ] [local.host1 ] [14.17.95.147 ] [日 6 月 22 02:34:01 2025 ]
[8] [27052] [ ] [ ] [pts/0 ] [ ] [0.0.0.0 ] [日 6 月 22 02:35:46 2025 ]
[7] [28531] [ts/0] [root ] [pts/0 ] [local.host ] [14.152.91.248 ] [日 6 月 22 02:38:41 2025 ]
[8] [28495] [ ] [ ] [pts/0 ] [ ] [0.0.0.0 ] [日 6 月 22 04:50:02 2025 ]对应的 last 输出示例:
root pts/0 local.host Sun Jun 22 02:38 - 04:50 (02:11)
root pts/0 local.host1 Sun Jun 22 02:34 - 02:35 (00:01)当会话没结束时,是不会写入登出记录的,而使用 last 输出的结果中不会显示单独的登出记录。
lastlog
lastlog -C -u root执行 lastlog 会显示所有用户上次登录的 ip 和时间,-C 参数可以清除 -u 指定用户的记录。
需要篡改其内容的话可参考下面这个仓库 https://github.com/AV1080p/logtamper
python logtamper.py -m 3 -u root -i 192.42.0.69 -t tty1 -d 2025:09:09:23:11:12python3 版本: https://github.com/kidgokugoku/logtamper