暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

linux 下的 history 命令

生有可恋 2022-10-06
1524

history 命令是黑客的最爱,入侵后首先会通过 history 查看用户都做了什么操作。类似我们浏览器的历史记录,我们在 shell 下的操作记录也会存在 history 日志中。history 命令与很多环境变量有关,通过调整变量可以调整history 的默认行为。

首先 history 并不是一个可执行文件,我们通过 which 或 locate 命令是无法定位它的。

    $ which history
    which: no history in PATH
    $ locate history
    $ type history
    history is a shell builtin

    history 是 shell 的内置的命令,可以理解为 history 是 shell 的一部分。history 是通过日志来记录历史命令的,可以通过环境变量查看日志都存在哪儿,以及可以存多少条。

      $ set | grep -i ^HIS
      HISTFILE=/c/Users/Administrator/.bash_history
      HISTFILESIZE=500
      HISTSIZE=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 histappend
          shopt -u histappend

          如果执行的命令为 -u 则说明这个选项被置为 disable 了,如果想启用 history 立刻写入, 可以执行 shopt -s 选项:

            shopt -s histappend

            history 命令是 shell 的一部分,所以有很多行为是受 shell 的环境变量影响的。虽然 HISTFILE 文件中只存了命令,实际上 history 是存了操作时间的,我们可以设置环境变量让 history 显示命令操作的时间。

              $ export HISTTIMEFORMAT='%F %T '


              $ history 5
              510 2022-10-04 23:12:36 shopt -s histappend
              511 2022-10-04 23:12:44 history | grep unset
              512 2022-10-04 23:12:54 history | grep export
              513 2022-10-04 23:13:03 export HISTTIMEFORMAT='%F %T '
              514 2022-10-04 23:13:07 history 5


              history 后面接数字可以只显示最后几条,第一列是命令行号,第二列为时间。其中行号也是有用的,可以执行通过 !n 执行第n行的命令。

                $ !510
                shopt -s histappend

                叹号是执行的意思,它的作用比我们想想的要多,!可以模糊匹配最近的命令,而不必全部敲完,比如 !sh 会从命令历史中去找以 sh 开头的命令:

                  $ !sh
                  shopt -s histappend

                  当我们刚敲完一个很长的命令,如果需要重新敲这个长命令,我们可以直接通过 ! 加部分开头的命令就可以直接执行了。

                  !叹号除了可以执行命令,它还可以用来代替参数。!$ 是上一条命令的最后一个参数,!^ 是上一条命令的第一个参数。!:n 是第n个参数。如果配置history 命令中的行号,还可以这么玩 !n:n 第n行的命令的第n个参数,我们可以用 echo 将其显现化:

                    $ history 5
                    517 2022-10-04 23:18:55 ls histappend
                    518 2022-10-04 23:19:01 echo histappend
                    519 2022-10-04 23:21:02 echo histappend
                    520 2022-10-04 23:21:34 echo $?
                    521 2022-10-04 23:22:36 history 5


                    $ echo !521:1
                    echo 5
                    5

                    以上技巧都是为了提升效率,最后说一下清日志,这个一般黑客干完活后会清理掉痕迹:

                      $ history -c


                      全文完。

                      如果转发本文,文末务必注明:“转自微信公众号:生有可恋”。

                             
                      文章转载自生有可恋,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                      评论