history命令
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用户才能改变。
其次,确保历史变量设置合理、无法更改。这些历史变量包括最重要的HISTFILE
、HISTCOMMAND
和HISTIGNORE
。要做到这一点,使用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的时候开启该功能即可激活。