history 命令是黑客的最爱,入侵后首先会通过 history 查看用户都做了什么操作。类似我们浏览器的历史记录,我们在 shell 下的操作记录也会存在 history 日志中。history 命令与很多环境变量有关,通过调整变量可以调整history 的默认行为。
首先 history 并不是一个可执行文件,我们通过 which 或 locate 命令是无法定位它的。
$ which historywhich: no history in PATH$ locate history$ type historyhistory is a shell builtin
history 是 shell 的内置的命令,可以理解为 history 是 shell 的一部分。history 是通过日志来记录历史命令的,可以通过环境变量查看日志都存在哪儿,以及可以存多少条。
$ set | grep -i ^HISHISTFILE=/c/Users/Administrator/.bash_historyHISTFILESIZE=500HISTSIZE=500
其中 HISTFILE 指向的是历史命令的存储位置,HISTFILESIZE 定义了history 存多少行,HISTSIZE 用来规则 history 命令输出多少行 。一般 HISTFILESIZE 与 HISTSIZE 设置一致,需要查看部分 history 输出时可以在 history 命令后面接数字,代表查看最后多少行:
$ history 10$ history 50$ history | tail 50$ history | head 50
shell 下有一个快捷键一般人不会用,这个快捷键用来在 history 中搜索命令,快捷键是 ctrl+r ,当输入 ctrl+r 后再输入部分命令就会自动从历史命令中搜索之前的命令。许多人试过之后发现搜索的命令并不是自己想要的,也无法翻页就觉得这个命令没什么用。这个命令的正确用法是每敲一次 ctrl+r 就会自动搜索下一条匹配的,直到翻到需要的,相当于 ctrl+r 就是翻页。
另外一个让人迷惑的地方就是为什么有的命令不会立刻存到 history 日志中,当执行 exit 退出时缓存中的命令才会一次性写入到 history 日志中。这个特性是受 shopt 控制的,shopt 是 shell 的 option 设置命令,通过 shopt -p 可以查看到所有的 shell 选项。其中与 history 命令相关的一个选项是 histappend,它代表是否立刻写入到 history 日志中。
$ shopt -p| grep -i histappendshopt -u histappend
如果执行的命令为 -u 则说明这个选项被置为 disable 了,如果想启用 history 立刻写入, 可以执行 shopt -s 选项:
shopt -s histappend
history 命令是 shell 的一部分,所以有很多行为是受 shell 的环境变量影响的。虽然 HISTFILE 文件中只存了命令,实际上 history 是存了操作时间的,我们可以设置环境变量让 history 显示命令操作的时间。
$ export HISTTIMEFORMAT='%F %T '$ history 5510 2022-10-04 23:12:36 shopt -s histappend511 2022-10-04 23:12:44 history | grep unset512 2022-10-04 23:12:54 history | grep export513 2022-10-04 23:13:03 export HISTTIMEFORMAT='%F %T '514 2022-10-04 23:13:07 history 5
history 后面接数字可以只显示最后几条,第一列是命令行号,第二列为时间。其中行号也是有用的,可以执行通过 !n 执行第n行的命令。
$ !510shopt -s histappend
叹号是执行的意思,它的作用比我们想想的要多,!可以模糊匹配最近的命令,而不必全部敲完,比如 !sh 会从命令历史中去找以 sh 开头的命令:
$ !shshopt -s histappend
当我们刚敲完一个很长的命令,如果需要重新敲这个长命令,我们可以直接通过 ! 加部分开头的命令就可以直接执行了。
!叹号除了可以执行命令,它还可以用来代替参数。!$ 是上一条命令的最后一个参数,!^ 是上一条命令的第一个参数。!:n 是第n个参数。如果配置history 命令中的行号,还可以这么玩 !n:n 第n行的命令的第n个参数,我们可以用 echo 将其显现化:
$ history 5517 2022-10-04 23:18:55 ls histappend518 2022-10-04 23:19:01 echo histappend519 2022-10-04 23:21:02 echo histappend520 2022-10-04 23:21:34 echo $?521 2022-10-04 23:22:36 history 5$ echo !521:1echo 55
以上技巧都是为了提升效率,最后说一下清日志,这个一般黑客干完活后会清理掉痕迹:
$ history -c
全文完。
如果转发本文,文末务必注明:“转自微信公众号:生有可恋”。




