history不保存命令

bash和zsh默认会将输入过的命令保存在 $HISTFILE 文件中,保存的数量由 $HISTSIZE 决定。

通过对$HISTCONTROL设置,可以让history不保存一些命令:

  • 设置为 ignorespace:以空格开头的行将不会记录到history中
  • 设置为 ignoredups:匹配上一次历史记录的行将不会被记录
  • 设置为 ignoreboth:同时使用ignorespace和ignoredups的行为
  • 如果没有定义,或者设置为其他值,所有解释器读取的行都将存入历史列表,但还要经过HISTIGNORE处理

可以通过 set -o history 来临时禁止本次登陆session中的history功能

对于已经记录在history中的命令:

  • 可以使用 history -c 清空历史记录
  • 可以使用 history -d N 删除第N条历史记录

zsh的history

zsh中使用命令history -i即可查看命令执行的时间,HISTTIMEFORMAT变量只对bash有效,zsh的history文件默认存储时间戳(开始时间以Unix纪元表示,经过的秒数以秒为单位)。

bash的HISTFILESIZE变量在zsh中对应的是SAVEHIST

$HISTFILE变量为保存文件,由于未找如何修改保存时间戳格式,初步想法是在执行history -i命令前使用export $HISTFILE=xxx

对history file作相应保障

https://www.cnblogs.com/weiji100/p/3964230.html https://blog.csdn.net/marklua/article/details/42396361

首先,锁定shell的历史文件本身,更改它的属性为末尾只添加:chattr +a .bash_history。这样一来,就不可能删除或更改文件中的数据,连用户都无法改变属性——只有root用户才能改变。

其次,确保历史变量设置合理、无法更改。这些历史变量包括最重要的HISTFILEHISTCOMMANDHISTIGNORE。要做到这一点,使用shell的typeset命令,带-r选项,这使得指定的变量拥有只读属性。良好的操作规范是使所有历史环境变量都变为只读,比如:

export HISTCONTROL=""
export HISTFILE=$HOME/.bash_history
export HISTFILESIZE=2000
export HISTIGNORE=""
export HISTSIZE=1000
export HISTTIMEFORMAT="%a %b %Y %T %z "
typeset -r HISTCONTROL
typeset -r HISTFILE
typeset -r HISTFILESIZE
typeset -r HISTIGNORE
typeset -r HISTSIZE
typeset -r HISTTIMEFORMAT

HISTTIMEFORMAT是bash shell的扩展,将在历史文件中提供时间戳。

对于bash shell来说,你需要更改历史的一些标准选项:

#设置cmdhist将把多行命令放入到单单一个历史行
shopt -s cmdhist
#设置histappend将确保被添加到历史文件,而不是像通常的做法那样覆盖历史文件
shopt -s histappend

对于bash shell来说,还要设置PROMPT_COMMAND:

PROMPT_COMMAND="history -a" 
typeset -r PROMPT_COMMAND

这是由于bash shell实际上把历史写入到内存中,历史文件仅在shell会话结束时加以更新。这个命令会把上一个命令附加到磁盘上的历史文件。

最后,创建一个SIGDEBUG陷阱,将命令发送到系统日志(syslog)。VMware的ESXi借助自己版本的ash shell已经具有这样的功能。简而言之,应创建一个把当前命令记入日志(从历史文件获取)的函数,然后用logger命令,把它发送到系统日志。这一步在bash shell和Korn Shell中都适用。 这些步骤有些冗长,不过在新版的bash和ksh中有一些新的功能特性,让这一切变得极其容易。GNU Bash在4.1版中添加了记入到系统日志中的功能,只需要编译shell的时候开启该功能即可激活。