谁动了我的 Linux?原来 history 可以这么强大!
当我们频繁使用 Linux 命令行时,有效地使用历史记录,可以大大提高工作效率。
在平时 Linux 操作过程中,很多命令是重复的,你一定不希望大量输入重复的命令。如果你是系统管理员,你可能需要对用户操作进行审计,管理好 Linux 命令历史记录显得非常重要。
今天我们来介绍一下,在 Linux 使用 history 来减少重复命令的几个实用技巧。
1 基本原理

Linux 命令的历史记录,会持久化存储,默认位置是当前用户家目录的 .bash_history 文件。
当 Linux 系统启动一个 Shell 时,Shell 会从 .bash_history 文件中,读取历史记录,存储在相应内存的缓冲区中。
我们平时所操作的 Linux 命令,都会记录在缓冲区中。包括 history 命令所执行的历史命令管理,都是在操作缓冲区,而不是直接操作 .bash_history 文件。
当我们退出 Shell,比如按下 Ctrl+D 时,Shell 进程会把历史记录缓冲区的内容,写回到 .bash_history 文件中去。
2 使用详解
清楚了 history 的基本原理,我们来具体学习一下如何使用它。
(一)基础用法
直接输入 history 命令,可以看到最近操作的所有命令都显示出来了
$ history
1 bash
2 ls
3 vim .bash_history
4 cat .bash_history
5 history
6 bash
有时候我不需要显示所有的历史命令,只显示最后的 10 条历史记录,可以在命令后加数字 N 即可
$ history 10
正常情况下,只有在 Shell 正常退出时,才会将缓冲区内容保存到文件。如果你想主动保存缓冲区的历史记录,执行 -w 选项即可
$ history -w
当然,如果你执行了一些敏感的命令操作,可以执行 -c 将缓冲区内容直接删除
$ history -c
(二)重复执行命令
如果要重复执行一些命令,可以使用 ! 来快速执行重复的命令。
举个例子,重复执行第 1024 历史命令,可以执行如下命令
$ !1024
1024 这个编号可以通过 history 查看哦
重复执行上一条命令
$ !!
重复执行倒数第 6 条历史命令,可以通过负数表示,-6 表示倒数第 6 条记录
$ !-6
(三)搜索历史命令
有时候,需要重复执行某字符串开头的最后一个命令,同样可以通过 ! 来操作,然后按 Enter 执行即可
比如,刚才执行了一个很长命令,只记录命令开头是 curl,这时就可以通过 !curl 快速执行该命令
$ !curl
这个用法很高效,但存在不安全因素,因为有可能执行的命令不是你想要执行的,那就坏事了。可以通过 :p 来安全地执行。
$ !curl:p
curl www.sina.com.cn
加上 :p 后,只是打印出了搜索到的命令,如果要执行,请按 Up 键,然后回车即可。
如果你只知道某条命令包含了 x 信息,不是以 x 开头,同样可以通过 ? 来执行包含字符串的命令
$ !?sina
(四)交互式搜索历史命令
在 Linux 搜索历史命令,还可以通过交互式的搜索方式,简直高效直接。在命令行输入 Ctrl+R 后,进入交互界面,键入需要搜索的关键字,如果匹配到多条命令,可以多次键入 Ctrl+R 来切换上一条匹配的命令。
(reverse-i-search)`sina': echo sina
可以看到,我输入了 sina 后,就自动匹配到最近一次和 sina 匹配的命令,这时按下回车就可以执行该命令。
(五)重复执行上条命令
在这里总结下多种重复执行上条命令的方式,你可以选择一种自己喜欢的就可以啦
!!!-1Ctrl+pUpCtrl+R
(六)显示时间戳
有时候需要对 Linux 系统做审计,那为历史记录添加时间戳,显示非常有用。
$ export HISTTIMEFORMAT='%F %T '
$ history 3
46 2021-04-18 15:21:33 curl baidu.com
47 2021-04-18 15:21:35 pwd
48 2021-04-18 15:21:39 history 3
可以看到,历史记录已经显示了时间戳。其实这些对于审计需求,还不够,可以加上更详细的信息:
$ export HISTTIMEFORMAT="%F %T `who -u am i 2>/dev/null| awk '{print $NF}'|sed \-e 's/[()]//g'` `whoami` "
6 2021-04-18 16:07:48 113.200.44.237 root ls
7 2021-04-18 16:07:59 113.200.44.237 root pwd
8 2021-04-18 16:08:14 113.200.44.237 root history
(七)控制历史记录总数
默认情况下,Linux 系统最多存储 1000 条历史记录,可以通过 HISTSIZE 环境变量查看
$ echo $HISTSIZE
1000
对于需要做审计的场景,1000 条历史记录可能会太少了,我们可以修改为合适的值
$ export HISTSIZE=10000
注意,HISTSIZE 变量只能控制缓冲区中的历史记录数量,如果需要控制 .bash_history 文件存储的最大记录数,可以通过 HISTFILESIZE 进行控制
上述命令行修改只在当前 Shell 环境生效,如果需要永久生效,需要写入配置文件
$ echo "export HISTSIZE=10000" >> ~/.bash_profile
$ echo "export HISTFILESIZE=200000" >> ~/.bash_profile
$ source ~/.bash_profile
(八)更改历史记录文件名
有时,为了方便管理和备份,需要更改历史记录文件的路径和名称。简单,同样可以通过环境变量 HISTFILE 更改它的文件名称
$ echo "export HISTFILE=/data/backup/chopin.bash_history" >> ~/.bash_profile
$ souce ~/.bash_profile
(九)禁用历史记录
处于某种特殊环境,我们需要禁用历史记录
$ echo "export HISTSIZE=0" >> ~/.bash_profile
$ echo "export HISTFILESIZE=0" >> ~/.bash_profile
$ source ~/.bash_profile
哈哈,直接把上述两个变量的值设置为 0,就实现了禁用历史记录的功能
(十)黑客必知的一个小技巧
最后分享一个不为人知的,黑客必知的小技巧。
在命令前额外多加一个空格,这样的命令是不会被记录到历史记录的,感觉是不是很酷
这个技巧如果在你的系统不管用,请查看下环境变量 HISTCONTROL 是否包含 ignorespace,貌似 centos 系统默认没有设置这个值。
3 总结时间
在 Linux 系统,history 命令可以非常方便,帮助我们管理历史命令,平时我们命令都会先记录在缓存区,在 Shell 退出时才会记录到文件中。
history 命令提供了很方便的管理功能,合理去配置和管理历史记录,可以让你的 Linux 系统更加健壮和安全。
好了,老规矩,贴心的肖哥还是来总结一下 history 命令常用方法
history n:只显示最近的 n 条历史记录history -c:清除缓存区中的历史记录history -w:将缓存区的历史记录保存到文件history -d N:删除第 N 条历史记录
几种重复执行命令的方法:!!、!-1、!N、!string 等
交互式历史命令搜索,请使用 Ctrl+R 快捷键
合适使用几个相关的环境变量,让你的 Linux 系统更安全:
HISTSIZE:控制缓冲区历史记录的最大个数HISTFILESIZE:控制历史记录文件中的最大个数HISTIGNORE:设置哪些命令不记录到历史记录HISTTIMEFORMAT:设置历史命令显示的时间格式HISTCONTROL:扩展的控制选项
如果在生产环境,这些环境变量需要持久化到配置文件 ~/.bash_profile
export HISTCONTROL=ignoreboth
# ignorespace: 忽略空格开头的命令
# ignoredups: 忽略连续重复命令
# ignoreboth: 表示上述两个参数都设置
# 设置追加而不是覆盖
shopt -s histappend
export HISTSIZE=1000
export HISTFILESIZE=200000
export HISTTIMEFORMAT="%F %T "
export HISTIGNORE="ls:history"
推荐阅读
写给 Linux 初学者的一封信 全网最详尽的负载均衡原理图解 上古神器 sed 教程详解,小白也能看的懂 Linux 三剑客之 grep 教程详解 Linux 文件搜索神器 find 实战详解,建议收藏! Linux 网络分析必备技能:tcpdump 实战详解 Linux 三剑客之 awk 实战详解教程 80% 的人都不会的 15 个 Linux 实用技巧 谁动了我的Linux?原来history这么强大! 在Linux上使用time优雅的统计程序运行时间
欢迎各位老铁关注

谁动了我的 Linux?原来 history 可以这么强大!的更多相关文章
- Linux下history命令用法
如果你经常使用 Linux 命令行,那么使用 history(历史)命令可以有效地提升你的效率.本文将通过实例的方式向你介绍 history 命令的 15 个用法. 使用 HISTTIMEFORMAT ...
- linux下history命令显示历史指令记录的使用方法
Linux系统当你在shell(控制台)中输入并执行命令时,shell会自动把你的命令记录到历史列表中,一般保存在用户目录下的.bash_history文件中.默认保存1000条,你也可以更改这个值 ...
- Linux下history命令详解---转载
Linux下History命令主要用于显示历史指令记录内容, 下达历史纪录中的指令 . >History命令语法:[www.linuxidc.com@linux]# history [n][ww ...
- [转]Linux Shell History (快速使用Linux命令)
http://www.blogjava.net/lihao336/archive/2010/10/11/334367.html Linux Shell History (快速使用Linux命令) Li ...
- linux 修改history带有时间
今天在网上学到了给linux的history添加时间.方法如下: 首先已知HISTTIMEFORMAT可以给history设置时间:临时修改直接赋值:HISTTIMEFORMAT="%F % ...
- [转帖]linux 清空history以及记录原理
linux 清空history以及记录原理 自己的linux 里面总是一堆 乱七八槽输错的命令 用这个办法 可以清空 linux的内容. 清爽一些. 1.当前session执行的命令,放置缓存中,执行 ...
- Linux查看History记录加时间戳小技巧
Linux查看History记录加时间戳小技巧 熟悉bash的都一定知道使用history可以输出你曾经输入过的历史命令,例如[root@servyou_web ~]# history | more ...
- [Linux] 关于 history 命令的简单使用
1. 如果不想记录当前 会话操作的命令的话 可以使用命令 set +o history 但是这个命令有一个坏处, 他自己被记住了... 2. 还有一个办法 就是 在退出登录之前执行命令 history ...
- Linux:history命令详解
Linux下History命令 主要用于显示历史指令记录内容, 下达历史纪录中的指令 . 语法 history [n] history [-c] history [-raw] histfiles ...
随机推荐
- .zip爆破
.zip爆破 Python的优化问题 Python在计算密集型任务方面没有明显的多线程优化,多线程更加适合用于处理I/O密集型任务(如网络请求).爆破任务使用顺序执行即可. 编写Python脚本 一个 ...
- mongodb安装及常见命令操作
Mongodb是一个介于关系数据库和非关系数据库之间的产品(Nosql),是非关系数据库当中功能最丰富,最像关系数据库的,语法有点类似javascript面向对象的查询语言,它是一个面向集合的,模式自 ...
- 攻防世界 reverse 新手练习区
1.re1 DUTCTF IDA shift+F12 查看字符串 DUTCTF{We1c0met0DUTCTF} 2.game ZSCTF zsctf{T9is_tOpic_1s_v5ry_int7r ...
- 【odoo14】第二十三章、管理邮件
邮件集成是odoo最重要的特性.我们可以通过odoo收发邮件.我们甚至可以管理业务文档上的电子邮件,如潜在客户.销售订单和项目.本章,我们将探讨在odoo中处理邮件的方式. 配置邮件服务器 管理文档中 ...
- Python基础之数据类型详解(2)
今天继续昨天的python基本数据类型详解,按照上一篇博文的格式,接下来讲解列表.元组.字典以及集合. 列表 1.用途按位置存放多个值2.定义在[]内用逗号分割开多个任意类型的元素 # 定义列表 # ...
- 灵雀云Istio技术实践专题整理
Istio技术实践专题(1) Service Mesh Istio 基本概念和架构基础 Istio被称作Kubernetes的最佳云原生拍档.从今天起,我们推出"Istio技术实践" ...
- 【10.5NOIP普及模拟】sum
[10.5NOIP普及模拟]sum 文章目录 [10.5NOIP普及模拟]sum 题目描述 输入 输出 输入输出样例 样例输入 样例输出 解析 code 题目描述 小x有很多糖果,分成了 N 堆,排成 ...
- (6)MySQL进阶篇SQL优化(MyISAM表锁)
1.MySQL锁概述 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源 (如 CPU.RAM.I/O 等)的抢占以外,数据也是一种供许多用户共享的资源.如何保证数 据并 ...
- Python中的多进程、多线程和协程
本文中的内容来自我的笔记.撰写过程中参考了胡俊峰老师<Python程序设计与数据科学导论>课程的内容. 并发处理:多进程和多线程 前置 概念: 并发:一段时间内同时推进多个任务,但不一定要 ...
- 基于 Socket 的群聊聊天室(带图形界面,包含注册、登录、数据入库功能)
代码下载 https://github.com/juno3550/GroupChatRoom 实现框架 Chat 包: server.py:服务器端执行代码(TCP 服务器,根据客户端消息调用 mod ...