1 系统history记录优化
默认情况下,系统是不会记录我们执行命令的时间等相关信息的。
1.1 HISTCONTROL
-
介绍
使用HISTCONTROL
变量,您可以控制 bash 如何存储您的命令历史记录。您可以告诉它忽略重复的命令和/或忽略具有前导空格的命令。
在命令行工作时,我们经常会多次执行某些命令。默认历史记录大小为 500,相同命令的重复次数太多会填满您的历史记录,并使您的历史记录变得无用。您当然可以使用HISTSIZE
或HISTFILESIZE
增加历史列表的大小。
另一种选择是告诉 bash 不要存储重复项。这是通过HISTCONTROL
变量完成的。HISTCONTROL
控制 bash 如何存储命令历史记录。目前有两个可能的标志:ignorespace
和ignoredups
。ignorespace标志告诉 bash 忽略以空格开头
的命令。另一个标志ignoredups
告诉 bash 忽略重复项。如果您希望指定两个值,则可以用冒号 ignorespace:ignoredups连接和分隔值,或者您可以只指定``ignoreboth
。
-
常用的HISTCONTROL变量有
ignoredups
默认,忽略重复命令
ignorespace
忽略所有一空格开头的命令
ignoreboth
ignoredups 和 ignorespace 的组合
erasedups
删除历史记录中重复命令,相同的指令仅保留最近的一个
如果同时设定多个选项,中间使用冒号。如:HISTCONTROL=ignorespace:erasedups
[root@k8s-master01 ~]# export |grep -i histc declare -x HISTCONTROL="ignoredups"
1.2 HISTSIZE和HISTFILESIZE
-
介绍
当 Bash shell 在用户登录时以交互方式加载时,它会将历史文件的内容读入内存。在 shell 会话期间,它将内容添加到 history 的内存副本中。
当我们在终端上执行历史命令时,Bash 会读取内存中的副本以显示已执行命令的历史记录。最后,当 shell 退出时,它会将内存中的内容写回到磁盘上HISTFILE环境变量指向的文件中。
默认情况下,内容存储在位于用户主目录的.bash_history文件中。
[root@k8s-master01 ~]# echo $HISTFILE /root/.bash_history
HISTSIZE变量中设置的值是我们可以在内存中存储的最大历史行数。
HISTFILESIZE变量控制我们可以写回到磁盘上的历史文件的最大行数。
可以简单理解为HISTSIZE变量定义的是执行history命令时可以看到的命令数,HISTFILESIZE变量定义的是保存到磁盘中的history记录数。
https://www.baeldung.com/linux/bash-histsize-vs-histfilesize
[root@k8s-master01 ~]# echo $HISTSIZE 1000 [root@k8s-master01 ~]# [root@k8s-master01 ~]# echo $HISTFILESIZE 1000
1.1.3 HISTTIMEFORMAT
-
介绍
Linux 中的 bash shell 允许我们访问命令历史记录,即使用 history 命令按顺序执行的命令列表。history 命令用于跟踪所有已执行的命令。这在故障排除或审计期间非常重要。没有设置 HISTTIMEFORMAT 的历史命令只显示 command# 和 command 但不显示命令执行的时间。因此,要显示与每个历史条目关联的时间戳信息,必须设置 HISTTIMEFORMAT。
[root@k8s-master01 ~]# HISTTIMEFORMAT="%F %T " #历史记录中加上年月日及时间 [root@k8s-master01 ~]# history |tail 310 2022-11-21 11:44:58 echo $HISTFILE 311 2022-11-21 11:45:14 export |less 312 2022-11-21 12:05:10 vim /etc/profile 313 2022-11-21 12:05:25 HISTTIMEFORMAT="%F %T " 314 2022-11-21 12:05:27 history 315 2022-11-21 12:05:40 ls 316 2022-11-21 12:05:41 history 317 2022-11-21 12:06:00 vim /etc/profile 318 2022-11-21 12:06:11 source /etc/profile 319 2022-11-21 12:06:45 history |tail
1.3 PROMPT_COMMAND
-
介绍
在出现 shell 命令输入提示符之前,作为命令来执行这个变量。
https://juejin.cn/post/6844903834003701773
[root@k8s-master01 ~]# export PROMPT_COMMAND="date '+%F %T'" 2022-11-21 13:11:43# 在出现下面的提示符之前执行了 date 命令 [root@k8s-master01 ~]# ls anaconda-ks.cfg hosts k8s-ha-install kernel-ml-4.19.12-1.el7.elrepo.x86_64.rpm kernel-ml-devel-4.19.12-1.el7.elrepo.x86_64.rpm kubeadm-config.yaml new.yaml rook 2022-11-21 13:11:48# 再次出现 [root@k8s-master01 ~]# a -bash: a: command not found 2022-11-21 13:11:51# 每次命令行提示符出现之前它都会出现 [root@k8s-master01 ~]#
收集历史命令到文件中
[root@k8s-master01 ~]# mkdir -p /var/log/history.d [root@k8s-master01 ~]# echo 'export PROMPT_COMMAND="(umask 000; msg=\$(history 1 | { read x y; echo \$y; }); echo [\$(who am i | awk \"{print \\\$(NF-2),\\\$(NF-1),\\\$NF}\")] [\$(whoami)@\`pwd\`]\" \$msg\" >>/var/log/history.d/history)"' >> /etc/profile [root@k8s-master01 ~]# source /etc/profile [root@k8s-master01 ~]# tailf /var/log/history.d/history [2022-11-21 11:36 (172.20.18.152)] [root@/root] 2022-11-21 12:05:27 history [2022-11-21 11:36 (172.20.18.152)] [root@/root] 2022-11-21 12:05:40 ls [2022-11-21 11:36 (172.20.18.152)] [root@/root] 2022-11-21 12:05:41 history