一   history 历史命令

历史命令是被保存在'内存和~/.bash_history'中;当'退出'或者登录shell时,会'自动'保存或读取

(1)环境变量

①  HISTFILE

HISTFILE: 记录history 历史命令'记录文件'的位置,要有'读写'权限,默认是~/.bash_history

chattr +a ~/.bash_history 即'append',设定该参数后,只能'向文件中添加'数据,而'不能删除'

②  HISTSIZE

变量HISTSIZE: 命令'缓冲区'的大小

原理: 执行的命令,'先记录在命令缓冲区',在'缓冲区满'或'退出shell时'才将命令写入$HISTFILE

禁用 history:  'export HISTSIZE=0' --> 此时history'无输出',并且ctrl+r'不生效'

  

③  HISTTIMEFORMAT

应用场景: 要对 Linux 系统'做审计',那'为历史记录'添加时间戳

history命令'配置时间戳': export HISTTIMEFORMAT='%F %T'  <-- 常见

细节点: 

   1) 如果是"双引号"包括,可以使用"$USER"

   2) 或者'自定义变量'或'脚本'获取信息'存取到'变量中,然后在HISTTIMEFORMAT中'引用'

   案例 --> export HISTTIMEFORMAT="[%Y.%m.%d %H:%M:%S-$USER]"

④  HISTCMD

变量HISTCMD:记录'下一个命令'在history命令中的'编号'

⑤  HISTCONTROL

1) HISTCONTROL变量: 可以'控制'历史的记录方式

2) HISTCONTROL有以下的'选项':

   [1]、ignoredups        '默认',忽略重复命令

   [2]、ignorespace        忽略所有以'空格开头'的命令

   [3]、ignoreboth         ignoredups 和 ignorespace 的'组合'

   [4]、erasedups          删除历史记录中重复命令,相同的指令仅'保留最近'的一个

3) 如果同时'设定多个'选项,中间使用'冒号'

 HISTCONTROL=ignorespace:erasedups

​++++++++++++++++++++ "忽略某种格式的命令" ​++++++++++++++++++++

1) 强制 history 不记住'以空格'开头的命令: export HISTCONTROL=ignorespace 

   具体: 在不想被记住的'命令前'面输入一个'空格'

2) 禁止 shell 将命令记录到其命令历史记录中 --> "了解即可"

   思路: 运行后从历史记录中删除 linux 命令,

   方法: 是将命令附加到该history -d $(history 1)命令

   解读: 

     [1]、该$(history 1)子命令检索当前终端会话中历史记录中的最新条目

     [2]、其中1是'偏移量',该-d选项有助于'删除'它

⑥  HISTFILESIZE

变量HISTFILESIZE: 设置'HISTFILE文件'记录命令的行数,'限制'历史命令记录的行数

含义: 定义了在文件 '~/.bash_history' 中保存命令的'记录总数'

⑦  HISTIGNORE

HISTIGNORE: 忽略历史中的'特定'命令

⑧  汇总

1) 场景1: 需要对用户操作'进行审计',需要管理好 'linux 命令历史记录'

2)场景2: 为了'系统安全',系统被破解,hack可以通过'history'获取信息,需要'禁用'历史记录

  echo "export HISTSIZE=0" >> ~/.bash_profile

  echo "export HISTFILESIZE=0" >> ~/.bash_profile

  source ~/.bash_profile

(2)history命令

①  查看当前系统历史命令方式

1) 可以按一下'上|下'方向键,命令行就会显示相对于当前命令的上一条或下一条历史记录

2) 和方向键相同功能的就是组合键'Ctrl+p(前面执行过的命令)','Ctrl+n(后面执行过的命令)'

小结: 上面两个都是'相对于当前命令'查询上一条或者下一条命令的历史记录

3) 如果'搜索命令历史记录',就用Ctrl+r组合键进入历史记录搜寻状态,通过'关键字'搜索最近相关命令

4) history命令

② history命令

​用法:history [选项] [历史命令保存文件]

1) -c:清空历史命令'包括缓存和文件'

2) -w:把缓存中的历史命令立即'写入历史命令保存文件'~/.bash_history 

    history n        //显示'最近n条'历史命令记录

    history -d n     //删除'第n条'命令记录

注意:

1) ~/.bash_history中保存文件为上次登录正常退出后,缓存写入数据不包含本次登录后命令历史记录

2) history -c命令执行,清除了本地缓存,但'并不立即同步'至~/.bash_history文件中

3) 若想同步,bash_history,则history '-w'或者'正确退出'

③   其他隐藏操作命令历史记录

④   history流程图

(3) !命令

事件引用符!详细解读

①  基础

1) 使用"!number"重复执行第 n 条历史命令

   快速'重复执行'上一条命令 --> "四种方法": 上方向键、!!、!-1、crtl+p
   
2) 使用"!!" --> '执行最近的一条命令'

3) 使用'!字符串'重复执行最后一条'以该字串为开头'的命令

4) 当前命令获取'上一条命令参数' --> '!!:$'与'!$'都可以为当前命令获得'上一条命令的参数'

5) !^获得上一条命令的'第一项'参数

②  !string:p

1) !string

 这个用法'很高效',但存在'不安全'因素

 因为有可能执行的命令'不是你想要'执行的,那就坏事了。可以通过 ':p' 来'安全'地执行

2) !string:p

加上 :p 后,只是'打印出了搜索到的命令',如果'要执行',按 'Up 键',然后'回车'即可

③  注意特殊 

1)把感叹号"!"放在"双引号"里执行命令会'出错'

 eg:echo "hello!", 因为感叹号被解释成了一个历史命令

2) 然而在一个'脚本文件'里,这么写则是'正确'的,因为在'脚本文件'里bash的历史机制'被禁用'了

④  使用上一条命令最后一个参数

1) 这里的"!$"代表了上一条命令的"最后"一个参数

2) Esc快捷键 + .

3) alt + .

⑤  重复执行上条命令

1)!!

2)!-1

+++++++++ "快捷键" +++++++++

3)Ctrl+p

4)Up

⑥  其他杂谈

相关参考

1) !^           --> 使用'上条'命令的'第一个'参数

2) !$           --> 代表了上一条命令的'最后一个'参数

3) !:-          --> '去掉'最后一个参数'并执行上一个'命令

4) !*           --> 使用'上条命令'的'所有'参数  '等价' --> ':1-$'

5) !string:n    --> 使用'上条命令'指定的'参数'

  规则: 按照"![命令名]:[参数号]"的规则

6) !?string[?]  --> 执行'上一条'包含'关键字'的命令

7) 替换上条命令的参数 --> 将这条命令中的'old'更换为'new'

  find ./ -name "old*" -a -name "*.zip"

  !!:gs/old/new

8) 删除'除了cfg结尾以外'的所有文件 --> '逻辑非'的作用

  rm !(*.cfg)

9)  !!:$:r --> 获取'最后'一个参数,然后删除该参数的'后缀'

10) !!:$:h --> 获取'最后'一个参数,然后删除该参数的'文件名'

11) !!:$:e  --> 获取'suffix后缀'

重点: 

  1) 多数人会首先'选择按上箭头'提出上道命令,再'移动光标'去修改某'参数',这样'更直观'

  2) 但'效率上'就不够'使用引用符高',而且在'脚本中'用这个方法可以'简化'很多

  

(3)fc命令详解

1)fc 'Fix Commands 的缩写'是个 shell 内置命令 -->'了解即可'

2)用于在交互式 shell 里'列出、编辑和执行'最近输入的命令

3)可以用自己喜欢的'编辑器'编辑最近的命令并再次执行,而不用把它们整个重新输入一遍

4)除了可以'避免重复输入又长又复杂'的命令,它对'修正拼写错误'来说也很有用

补充: 可以通过sudo fc -e vim  --> ':!/bin/bash'提权

fc -l 10 --> 显示从'第10条到最近'的历史命令

fc案例

 (4)script命令

①  背景引出

1) 有些工具xsell、secureCRT 和 mobaXterm 都有将'终端操作和输出'保存到本地的功能

2) 但是'putty'工具就没有,这时'终端里的记录器'script 就派上用场了

②  man script

③  应用场景

1) 调试会产生'大量操作记录',需要'保存'到本地进行进一步分析

2) 与同事'协同工作',自己将工作完成了'一半',可以将操作过程记录下来,同事可以根据记录接着工作

3) 让人'远程协助'你,担心对方使坏,同时也可以'留下案底',将其'操作'记录下来

④  案例讲解

scriptreplay

script -c "bash -x ceshi.sh"  --> "命令回放"

script -t 2>time.log -qaf  command.log --> "分离"

需求: 记录'服务器用户会话'操作,以root身份编辑文件/etc/profile,在文件末尾'追加'以下内容

if [ $UID -ge 0 ]
then
    exec /usr/bin/script -t \
     2>/var/log/script-records/$USER-$UID-`date +%Y%m%d`.time \
     -a -f -q /var/log/script-records/$USER-$UID-`date +%Y%m%d`.log
fi

细节点: command.log是'用户输入和输出',cat查看可以解析'乱码'

录制回放  录制和回放

抓取Linux桌面的视频

Logo

更多推荐