目? ? ? ? ? ? ? ? 录
??history
命令在Linux系统中用于显示和管理用户在command line界面执行过的命令历史记录。这个命令会读取历史命令文件中的目录到历史命令缓冲区,同时也会将历史命令缓冲区中的目录写入命令文件。
history有以下几个主要功能:
另外,环境变量HISTSIZE控制了内存中能够存储的历史命令的数量,默认值是1000。
????????以下是history命令的详细语法说明:
????????history [选项] [参数]
选项有如下:
-c:清空命令历史。
????????此选项会清除当前会话中的命令历史记录,但不会影响保存在.bash_history文件中的记录。
-d <offset>:删除历史记录中指定的第<offset>个命令。
????????<offset>表示命令在历史列表中的位置。
<n> 或 -n:显示最近的<n>条历史命令。
????????如果不指定<n>,则默认显示当前会话中的所有历史命令。注意,这里的<n>应直接跟在history命令后面,而不是作为选项参数。
-a:追加本次会话新执行的命令历史列表至历史文件。
????????这会将当前会话中新增的命令追加到.bash_history文件中。
-r:读历史文件附加到历史列表。
????????此选项会将保存在.bash_history文件中的命令历史读取并加载到当前会话的历史列表中。
-w:保存历史列表到指定的历史文件。
????????此选项会将当前会话的命令历史保存到指定的文件中,通常是.bash_history文件。
-p:展开历史参数成多行,但不存在历史列表中。
????????此选项允许用户以多行形式查看历史参数,但并不会将这些参数添加到历史列表中。
-s:展开历史参数成一行,附加在历史列表后。
????????此选项会将历史参数以单行形式附加到历史列表的末尾。
????????history命令的选项和参数可能会因不同的操作系统版本或shell类型而有所差异。上述是基于常见的Bash shell进行说明的。
?????? History的命令介绍很多,后面也会讲到一些命令。这里就不再累述了。若大家有兴趣,可以留言给我,后期我可以再整理一下。
????????.bash_history文件是Bash shell默认保存命令历史的文件,通常位于用户主目录下。
1、当用户登录shell时,系统会将该文件中的命令历史读取到内存(缓冲区)中,以供history命令查询和显示。用户所操作的所有 Linux 命令,都会记录在 缓冲区 中。包括 history 命 令所执行的历史命令管理,都是在操作 缓冲区 ,而不是直接操作 .bash_history 文件。
2、当用户退出 Shell,比如按下 Ctrl+D 时,Shell 进程会把历史记录缓冲区的内容,写回到 .bash_history 文件中去。
????????.bash_history文件中的命令历史记录是持久保存的,而history命令操作的是当前会话内存中的历史列表。因此,使用history -c清空当前会话历史记录并不会影响.bash_history文件中的记录。
????????[root@localhost ~]# export HISTTIMEFORMAT='%F %T '
#若将HISTSIZE设置为0,代表禁用history
????????[root@localhost ~]# export HISTSIZE=0
????????[root@localhost ~]# export HISTSIZE=100000
超过的话会自动删除最老的数据
????????[root@localhost ~]# export HISTFILESIZE=8000
# 设置历史记录的文件名称为/home/history.log
????????[root@localhost ~]# export HISTFILE=/home/history.log
HISTCONTROL 是一个环境变量,它决定了如何管理历史记录。它的值可以是以下几种:
????????ignorespace:忽略以空格开头的命令。
????????ignoredups:忽略连续重复的命令。
????????ignoreboth:忽略以空格开头和连续重复的命令。
????????erasedups:删除连续重复的命令,只保留一个。
????????ignoreallbutlast:忽略所有命令,只保留最后一个。
比如:
# 去除连续的相同命令的条目,只保留一个。
[root@localhost ~]# export HISTCONTROL=ignoredups
# 在不想被记住的命令前面输入一个空格-就不会被记住
[root@localhost ~]# export HISTCONTROL=ignorespace
HISTIGNORE 是一个环境变量,用于指定在历史记录中需要忽略的命令。比如:
#忽略pwd、ls命令
????????[root@localhost ~]# export HISTIGNORE="pwd:ls:"
????????set +o history 开启,命令会被记录到历史记录中
?????? ?set -o history 关闭。命令不会被记录到历史中
查看了,发现.bash_history文件的格式包含时间戳和命令,混在一起不好看,大概格式如下:
#1704944134
tcpdump -i eth0 host 110.43.204.73 -w /home/20240111.pcap
#1704972568
date
因此编写了个bash脚本,从这个文件提取这些时间戳和命令,方便查看。代码如下:
#!/bin/bash
# 检查输入参数
if [ "$#" -ne 1 ]; then
echo "Usage: $0 <path_to_.bash_history_file>"
exit 1
fi
# 检查参数文件是否存在
if [ ! -f "$1" ]; then
echo "Error: File $1 does not exist."
exit 1
fi
# 读取.bash_history文件,并输出命令编号和命令
line_number=1
while IFS= read -r line; do
# 检查行是否以#开头,如果是,则认为是时间戳
if [[ $line =~ ^\#[0-9]+$ ]]; then
timestamp=${line:1} # 去掉#,保留时间戳
else
# 输出命令编号和命令
echo "$line_number $line"
((line_number++))
fi
done < "$1"
脚本演示:
[root@ecs-52a1 121yunwei]#
[root@ecs-52a1 121yunwei]#
[root@ecs-52a1 121yunwei]# ./con2.sh ?/root/.bash_history
1 ? ? ? rpm -qa|grep -i mysql
2 ? ? ? Find / -name mysql
3 ? ? ? find / -name mysql
4 ? ? ? rm -rf /usr/share/selinux/targeted/default/active/modules/100/mysql
5 ? ? ? rm -rf /var/lib/selinux/targeted/active/modules/100/mysql
6 ? ? ? rm?-rf /etc/my.cnf
7 ? ? ? cat /etc/my.cnf
8 ? ? ? rpm -qa|grep?-i mysql
9 ? ? ? rpm -qa|grep -i mysql
10 ? ? ?rpm -qa|grep -i maridb
11 ? ? ?systemctl stop firewalld
12 ? ? ?systemctl disable firewalld
13 ? ? ?vi /etc/selinux/config
14 ? ? ?netstat -ano ?| grep 8066
15 ? ? ?netstat -ano|grep 8066
16 ? ? ?netstat -ano|grep 8067
17 ? ? ?netstat -ano|grep 6379
18 ? ? ?netstat -ano|grep 5060
19 ? ? ?netstat -ano|grep 8083
20 ? ? ?netstat -ano|grep 3306
21 ? ? ?cd /home
22 ? ? ?df -h
23 ? ? ?du -h --max-depth=0
24 ? ? ?du -hd0
25 ? ? ?df -hl
26 ? ? ?chmod 777 ivms_deploy.sh
27 ? ? ?sh ivms_deploy.sh
28? ? ? exit
[root@ecs-52a1 121yunwei]#
[root@ecs-52a1 121yunwei]#
?
注意: 1,命令格式为:./con2.sh ?/root/.bash_history ,后面的是读取的bash_history文件的完整路径;
2,输入的几个命令没有看到,因为这些命令还在缓冲区中,还没有写到bash_history文件中。