如何自动留存终端输入的所有Shell命令(不受bash_history删除影响)
如何自动留存终端输入的所有Shell命令(不受bash_history删除影响)
嗨,这个需求我太懂了——毕竟bash_history被删了真的很头疼,尤其是需要回溯操作的时候。下面给你几个靠谱的方法,都能把输入的命令自动存到独立文件里,就算bash_history被删也不怕:
方法1:利用PROMPT_COMMAND实时记录命令
bash有个内置的PROMPT_COMMAND变量,它会在每次显示命令提示符之前执行指定的命令。我们可以用它来把刚输入的命令同步追加到一个永久日志文件里:
- 打开你的bash配置文件(个人用户用
~/.bashrc,全局所有用户生效用/etc/bash.bashrc):nano ~/.bashrc - 在文件末尾添加以下内容:
这里的逻辑是:# 实时将命令写入永久日志 PROMPT_COMMAND='history -a; tail -n1 ~/.bash_history >> ~/.permanent_command_log'history -a:把当前会话的历史命令立即写入~/.bash_history(默认是退出会话才写)tail -n1 ~/.bash_history:取出刚写入的最后一条命令>> ~/.permanent_command_log:把这条命令追加到你指定的永久日志文件里
- 保存文件后,让配置生效:
source ~/.bashrc - 最后记得给日志文件设置安全权限,防止其他用户查看:
你可以把chmod 600 ~/.permanent_command_log~/.permanent_command_log改成任意你想存放的路径,比如/var/log/user_commands.log(需要sudo权限)。
方法2:用script命令全程记录会话(含输出)
如果你不仅想记录命令,还想保存命令的执行结果,script命令绝对是最佳选择——它会完整记录整个终端会话的所有输入输出:
- 先创建一个存放会话日志的目录:
mkdir -p ~/.session_logs - 打开
~/.bashrc添加以下内容,让每次登录终端自动启动script:
解释一下:# 自动启动会话记录,避免重复执行 if [ -z "$SCRIPT_RUNNING" ]; then export SCRIPT_RUNNING=1 script -a ~/.session_logs/$(date +%Y%m%d_%H%M%S).log fi-a:以追加模式写入日志,避免覆盖旧文件$(date +%Y%m%d_%H%M%S):用当前时间命名日志文件,方便区分不同会话
- 生效配置后,下次登录终端就会自动开始记录,日志文件会存在
~/.session_logs里。
方法3:将命令发送到系统日志(更安全)
系统日志一般只有管理员能修改,把命令记录到这里就算用户删了自己的文件也能留存:
- 打开
~/.bashrc添加:
这个命令会把以下信息发送到系统日志:# 将命令记录到系统日志 export PROMPT_COMMAND='RETRN_VAL=$?; logger -p user.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]*[ ]*//") [$RETRN_VAL]"'$(whoami):执行命令的用户名[$$]:当前bash进程的ID$(history 1 | sed ...):取出刚执行的命令(去掉历史编号)[$RETRN_VAL]:命令的返回值(0表示成功,非0表示失败)
- 生效配置后,系统日志会默认存放在
/var/log/syslog(Debian/Ubuntu)或/var/log/messages(CentOS/RHEL)里,你可以用tail -f /var/log/syslog实时查看。
注意事项
- 如果你是管理员给多用户配置,优先用全局配置文件
/etc/bash.bashrc,但要注意权限问题 - 所有方法配置后,最好新开一个终端测试,确保日志正常生成
- 不要把日志文件放在用户能轻易删除的位置(比如用户家目录),如果要更安全,可以放到
/var/log下并设置root权限
备注:内容来源于stack exchange,提问作者Fardin
相关产品推荐
相关产品推荐

