Linux基础--history命令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux基础--history命令相关的知识,希望对你有一定的参考价值。

1、history作用

history有两个作用:

  • 用于显示历史记录和执行过的指令命令
  • 当登录shell或者是退出的时候会自动进行读取和存储

2、history常用语法

2.1. 常用用法

我们可以使用help来查看参数和用法

[root@mufengxiaoyue ~]# help history
history: history [-c] [-d 偏移量] [n] 或 history -anrw [文件名] 或 history -ps 参数 [参数...]
显示或操纵历史列表。

带行号显示历史列表,将每个被修改的条目加上前缀 `*。
参数 N 会仅列出最后的 N 个条目。

选项:
-c 删除所有条目从而清空历史列表。
-d 偏移量 从指定位置删除历史列表。

-a 将当前绘画的历史行追加到历史文件中
-n 从历史文件中读取所有未被读取的行
-r 读取历史文件并将内容追加到历史列表中

-w 将当前历史写入到历史文件中
并追加到历史列表中

-p 对每一个 ARG 参数展开历史并显示结果
而不存储到历史列表中
-s 以单条记录追加 ARG 到历史列表中

如果给定了 FILENAME 文件名,则它将被作为历史文件。否则
如果 $HISTFILE 变量有值的话使用之,不然使用 ~/.bash_history 文件。

如果 $HISTTIMEFORMAT 变量被设定并且不为空,它的值会被用于
strftime(3) 的格式字符串来打印与每一个显示的历史条目想关联的时
间戳,否则不打印时间戳

退出状态:
返回成功,除非使用了无效的选项或者发生错误。

可以看到我们执行history只需要后面加上选项和参数即可:

# history (选项)(参数)

2.2. 常用参数

日常工作中我们常用的参数有以下几个:

参数

描述

n

显示最近的N条记录

-a

将历史命令缓冲区中命令写入历史命令文件中

-c

将目前的shell中的所有 history 内容全部消除 (并非真的删除)

-r

将历史命令文件中的命令读入当前历史命令缓冲区

-w

将当前历史命令缓冲区命令写入历史命令文件中

-d

删除历史记录的指定行

2.3. 常用案例举例

2.3.1 获取历史记录的最新两条记录

[root@mufenggrow ~]# history 2
9 cd
10 history 2

这种方式获取的最新两条记录,也会把刚刚执行的命令算上了,所以如果我们要获取最新执行的两条命令,可以使用n+1
比如我们要查询两条,那就用 history 3 来获取。

2.3.2 清除全部历史记录

-c 参数主要用来清空所有历史记录

[root@mufenggrow ~]# history -c
[root@mufenggrow ~]# history
1 history

这种方式类似 与clear,相当于幸亏显示,并不会把文件中的历史记录删除,如果要真正的历史记录,需要用本文中第4条关于history的配置文件。

2.3.3 删除某一行数据

-d 参数,可以删除某行数据。
比如删除第358行数据

[root@mufenggrow ~]# history -d 358

这种方法的唯一不足就是,你得需要知道命令的行数,比如先用history去查看,看看命令在第几行,在调用history -d 来删除。

2.4. 关于history的配置文件

所有我们用history命令看到的历史记录,都默认保存在:
~/.bash_history
如果是root用户就是在/root/.bash_history

直接删掉这个文件会清除所有历史记录,再登陆系统会自动重新生成这个文件。

Linux基础--history命令_MySQL

Linux 命令的历史记录,有持久化存储,默认位置是当前用户家目录的 .bash_history 文件。

当 Linux 系统启动一个 Shell 时,Shell 会从 .bash_history 文件中,读取历史记录,存储在相应内存的缓冲区中。

我们平时所操作的 Linux 命令,都会记录在 缓冲区 中。包括 history 命令所执行的历史命令管理,都是在操作 缓冲区 ,而不是直接操作 .bash_history 文件。

当我们退出 Shell,比如按下 Ctrl+D 时,Shell 进程会把历史记录缓冲区的内容,写回到 .bash_history 文件中去。

2.5. 隐藏历史记录实战

有时候我们觉得命令中出现了密码不安全,比如我们执行 mysql -u root -p123456 这个命令的时候,其他人如果查看历史记录,也会看到我们的MySQL密码,于是我们就有了隐藏某条历史记录的需求。

想要隐藏某条历史记录,会用到set +o
set +o history 表示开始隐藏
set -o history 表示结束隐藏

[root@mufenggrow ~]# set +o history   ## 设置开启隐藏
[root@mufenggrow ~]# mysql -uroot -p123456
ERROR 2002 (HY000): Cant connect to local MySQL server through socket /var/lib/mysql/mysql.sock (2)

## 这里的MySQL报错是因为没有MySQL服务

[root@mufenggrow ~]# history 3
1 history
2 history -d 358
## 查看历史记录发现没有刚才执行的带有密码的MySQL命令
[root@mufenggrow ~]# set -o history
## 取消history
[root@mufenggrow ~]# mysql -uroot -p123456
ERROR 2002 (HY000): Cant connect to local MySQL server through socket /var/lib/mysql/mysql.sock (2)

[root@mufenggrow ~]# history 3
3 mysql -uroot -p123456
4 histroy 3
5 history 3
## c此时发现有刚才执行过的MySQL命令

2.6. linux命令审计

有时候我们需要对 Linux 系统做审计,那为历史记录添加时间戳,就非常有用。

2.6.1 显示历史记录的时间

export HISTTIMEFORMAT=%F %T ’

[root@mufenggrow ~]# export HISTTIMEFORMAT=%F %T 
[root@mufenggrow ~]# ping www.baidu.com
PING www.baidu.com (110.242.68.3) 56(84) bytes of data.
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=1 ttl=52 time=26.4 ms
^C
--- www.baidu.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 26.470/26.470/26.470/0.000 ms
[root@mufenggrow ~]# history 3
17 2023-01-11 16:46:52 export HISTTIMEFORMAT=%F %T
18 2023-01-11 16:46:57 ping www.baidu.com
19 2023-01-11 16:47:03 history 3

2.6.2 控制历史记录的总数

这里我们会用到一个变量 HISTSIZE ,查看变量信息用下面的命令:
echo $HISTSIZE 查看历史记录总数

[root@mufenggrow ~]# echo  $HISTSIZE
1000
[root@mufenggrow ~]# export HISTISIZE=100

可以看到默认的历史记录总条数为1000,实际上做审计的时候我们会适当把记录总数调大一点。

如果你想要让上面的操作永久生生效,可以使用下面的方法:

echo  "export HISTSIZE=10000" >>  ~/.bash_profile
source ~/.bash_profile

这样相当于做了持久化,我们保存到文件里的内容,不会因为你重启服务器而丢失数据。

以上是关于Linux基础--history命令的主要内容,如果未能解决你的问题,请参考以下文章

Linux基础--history命令

Linux 基础教程 44-history命令

linux基础linux 多个会话同时执行命令后history记录不全的解决方案

linux bash基础特性

Linux学习总结(75)—— Linux history 命令实用技巧

Linux学习总结(75)—— Linux history 命令实用技巧