Linux之history历史命令管理
1.history命令简介
当使用终端命令输入并执行命令时,Linux会自动把命令记录到历史列表中,一般保存在用户HOME目录下的.bash_history文件中。默认保存1000条,这个值可以更改。
2.history语法
history(选项)(参数)
选项
-N: 显示历史记录中最近的N个记录;
-c:清空当前历史命令;
-a:将历史命令缓冲区中命令写入历史命令文件中;
-r:将历史命令文件中的命令读入当前历史命令缓冲区;
-w:将当前历史命令缓冲区命令写入历史命令文件中;
-d:删除历史记录中第offset个命令
-n:读取指定文件
3.使用命令历史
举例 | 描述 |
---|---|
!! | 运行上一个命令 |
!6 | 运行第6个命令 |
!8/test | 运行第8个命令并在命令后面加上/test |
!?CF? | 运行上一个包含CF字符串的命令 |
!ls | 运行上一个ls命令 (或以ls开头的历史命令) |
!ls:s/CF/G | 运行上一个ls命令,其中把CF替换成G |
fc | 编辑并运行上一个历史 |
fc 6 | 编辑变运行第6条历史命令 |
bootroot^ | 快速替换。将最后一个命令的boot替换为root后运行 |
!-5 | 运行倒数第5个命令 |
!$ | 运行前一个命令最后的参数 |
4.搜索历史命令
快捷键 | 描述 |
---|---|
↑(向上方向箭) | 查看上一个命令 |
↓(向下方向箭) | 查看下一个命令 |
Ctrl+p | 查看历史列表中的上一个命令 |
Ctrl+n | 查看历史列表中的下一个命令 |
Ctrl+r | 输入单词搜索历史命令 |
Alt+p | 输入字符查找与字符相接近的历史命令 |
5.执行history命令显示用户和执行时间
默认情况下history是这样显示命令的
[root@docker home]# history | head -10
18 iptables -t filter -vnL INPUT --line
21 iptables -t filter -vnL INPUT --line
22 iptables -t filter -D INPUT 2
23 iptables -t filter -D INPUT 1
24 iptables -t filter -vnL INPUT --line
26 iptables -t filter -A INPUT -j REJECT
27 iptables -vnL INPUT --line
为了方便排查问题,需要在每个执行命令前加上执行时间,添加如下内容到/etc/profile配置文件
vim /etc/profile
HISTTIMEFORMAT="%Y-%m-%d:%H-%M-%S:`whoami`: "
export HISTTIMEFORMAT
source /etc/profile
配置完成后,显示效果如下
[root@docker home]# history |head -10
22 2019-10-22:10-18-27:root: iptables -t filter -D INPUT 2
23 2019-10-22:10-18-27:root: iptables -t filter -D INPUT 1
24 2019-10-22:10-18-27:root: iptables -t filter -vnL INPUT --line
26 2019-10-22:10-18-27:root: iptables -t filter -A INPUT -j REJECT
27 2019-10-22:10-18-27:root: iptables -vnL INPUT --line
6.修改用户history命令保存条数
[root@docker ~]# sed -i 's/^HISTSIZE=1000/HISTSIZE=2000/' /etc/profile
[root@docker ~]# source /etc/profile
查看当前history命令记录数量
[root@docker home]# echo $HISTSIZE
2000
7.实现脚本方式记录所有用户的history命令
实现功能如下:记录登录ip、登录用户、登录时间、执行命令。
操作方式如下:直接放到/etc/profile文件里,或者编辑脚本放到/etc/profile.d/目录下。
[root@docker root]# vim /etc/profile.d/history.sh
#!/bin/bash
export HISTTIMEFORMAT="[%Y.%m.%d %H:%M:%S]"
USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
HISTDIR=/var/log/.hist
if [ -z $USER_IP ];then
USER_IP=`hostname`
fi
if [ ! -d $HISTDIR ];then
mkdir -p $HISTDIR
chmod 777 $HISTDIR
fi
if [ ! -d $HISTDIR/${LOGNAME} ];then
mkdir -p $HISTDIR/${LOGNAME}
chmod 300 $HISTDIR/${LOGNAME}
fi
export HISTSIZE=4096
DT=`date "+%Y%m%d_%H%M%S"`
export HISTFILE="$HISTDIR/${LOGNAME}/${USER_IP}.hist.$DT"
chmod 600 $HISTDIR/${LOGNAME}/*.hist* 2>/dev/null
[root@docker root]# source /etc/profile