谁动了我的Linux?原来history这么强大!

比特逐影鹤
• 阅读 17301

当我们频繁使用 Linux 命令行时,有效地使用历史记录,可以大大提高工作效率。

在平时 Linux 操作过程中,很多命令是重复的,你一定不希望大量输入重复的命令。如果你是系统管理员,你可能需要对用户操作进行审计,管理好 Linux 命令历史记录显得非常重要。

今天我们来介绍一下,在 Linux 使用 history 来减少重复命令的几个实用技巧。

1 基本原理

谁动了我的Linux?原来history这么强大!

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 匹配的命令,这时按下回车就可以执行该命令。

(五)重复执行上条命令

在这里总结下多种重复执行上条命令的方式,你可以选择一种自己喜欢的就可以啦

  • !!

  • !-1

  • Ctrl+p

  • Up

  • Ctrl+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?原来history这么强大!

点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
芝士年糕 芝士年糕
2年前
如何在 Linux 命令行中终止进程?
如果你想在linux上停止某个进程,你会怎么操作?如果命令/进程在前台运行,您可以使用CtrlC终端快捷方式,但是,如果进程不可见(在后台运行),您可以使用专用命令“杀死它”。“终止进程”是指在执行过程中停止进程,如果您知道进程ID(PID),则可以使用kill命令,如下所示:kill在上面的语法中,signal指的是要发送终止的终止信号,
编程修养 编程修养
4年前
Linux 三剑客之 grep 使用详解
Linux最重要的三个命令在业界被称为三剑客,它们是:awk、sed、grep。sed已经在上篇(https://mp.weixin.qq.com/s/XvTrfKfYZHnGZQ1O1K9lg)中讲过,本文要讲的是grep命令。我们在使用Linux系统中,grep命令的使用尤为频繁,熟练掌握grep的常见用法,能够极大地提高你的
可莉 可莉
3年前
10.16 学习之初 约定 认识Linux 安装虚拟机 安装centos7
一,学习之初1.Linux系统管理员要养成的习惯要习惯使用命令行:命令行是Linux系统正常运行的核心,也是专业Linux系统工程师必须掌握的技能,所以我们要习惯使用命令行。2.操作要严谨在学习Linux命令行的过程中,你输入命令的速度会越来越快,效率也会越来越高。但与此同时,你也有可能输入了错误的命令而不自
Stella981 Stella981
3年前
Linux服务器时间同步
导读Linux服务器运行久时,系统时间就会存在一定的误差,一般情况下可以使用date命令进行时间设置,但在做数据库集群分片等复杂操作时对多台机器的时间差是有要求的,此时就需要使用ntpdate进行时间同步。Linux时间的操作的常见命令date命令使用方式:date\u\\ddatestr\\
Stella981 Stella981
3年前
Linux必知必会
!DSC07274(https://oayrssjpa.qnssl.com/DSC07274.jpg)\TOC\本文详细介绍了Linux系统中的free命令的使用方法以及关键参数的含义,这可能是你见过的关于free命令最详细的一篇文章了,绝对值得你收藏。free命令显示了Linux系统中物理内存、交换分区的使用统计信息。
Stella981 Stella981
3年前
CentOS 显示历史执行过的命令以及用户历史命令缓存文件
1、history命令用于显示历史执行过的命令执行history命令能显示出当前用户在本地计算机中执行过的最近1000条命令记录。如果觉得1000不够用,还可以自定义/etc/profile文件中的HISTSIZE变量值。在使用history命令时,如果使用\c参数则会清空所有的命令历史记录。root@bigd
Stella981 Stella981
3年前
Linux下登录凭证窃取技巧
当获得一台主机的root权限,我们总是会想办法通过收集各种密码凭证,以便继续扩大战果。Linux下的环境,相对比更纯粹一些,介绍几个比较常见的技巧和工具。关键词:凭证窃取、口令收集、密码抓取、密码嗅探01、history记录敏感操作Linux系统会自动把用户的操作命令记录到历史列表中,当用户在命令行中输入账号、密码进
Wesley13 Wesley13
3年前
Java 程序员必须掌握的 Linux 命令
  作为一个Java开发人员,有些常用的Linux命令必须掌握。即时平时开发过程中不使用Linux(Unix)或者mac系统,也需要熟练掌握Linux命令。因为很多服务器上都是Linux系统。所以,要和服务器机器交互,就要通过shell命令。  本文并不会对所有命令进行详细讲解,只给出常见用法和解释。具体用法可以使用–help查看帮助或者直接通过goog
掌握了这几个 Linux 命令可以让你工作效率提升三倍
很多程序员熟悉了在Windows环境下开发,而我们服务器一般都是Linux系统。当有一天你需要在Linux服务器上做一些配置或者故障排除的时候,你会很困惑,不知道如何下手。原因是对Linux常用的命令还不熟悉,今天我就给大家介绍几个Linux常用命令。掌握它们的用法后,我们在使用CRMEB打通版系统的时候就能如鱼得水,可以大大提高工作
Linux策略路由详解
概述在Linux中,我们通常使用route命令来做路由信息的管理。但是该命令仅仅只能用于基本路由信息的管理,面对功能更加强大的基于策略的路由机制,route命令就显得捉襟见肘。在传统路由算法中,只能基于目的地址进行路由选择。但是如果对