习题一 :在当前主机编写脚本文件history_max.sh显示主机中执行频率最高的前5个命令
习题二 : 判断主机是否存在rhel用户,如果存在则设置密码为redhat,如果不存在则创建用户
并设置密码
习题三 :通过设置变量HISTTIMEFORMAT,使得当执行history命令时,输出格式如下:
[2022-12-25 16:10:05][root]history
习题一 :在当前主机编写脚本文件history_max.sh显示主机中执行频率最高的前5个命令
思路分析
# 拿到本题,以做过这道题,又回过头来讲,本题其实在知识量方面考察了好些基础命令
命令包括
===>>>
history tr cut sort uniq head
对上示命令进行了灵活运用,包括对其 选项 的运用~!!
# 命令选项
===>>>
tr -s " " 表示 删除所有重复出现字符序列,即删除 " " -- 空格
cut -d " " -f 3- -d:分隔符,按照指定分隔符分割列。与 -f 一起使用
-f:依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思
-f 3- : 表示从第三列开始都取
uniq -c 表示删除连续的重复行并在每列旁边显示该行连续重复出现的次数
sort -t " " -k 1 -nr 表示指定第一列为排序依据并以数值型倒序排序
head -5 表示只显示文件前五行
题目解答 :
# 创建 history_max.sh 脚本文件
[root@fsw Day1]# vim history_max.sh
===>>>
脚本编写完毕,保存脚本文件
保存脚本文件完毕后,运行脚本即可~!!
但运行脚本时,就会发现问题~!!
注 : 脚本文件运行需强调注意事项,下示即是~!!!
注意事项 :
# 本题还需要强调的一点就是,当整个脚本编写完成后,准备运行时所出现的问题~!
===>>>
当你运行该脚本文件时,你发现,运行脚本文件的四种方式,
只有 source history_max.sh 和 . history_max.sh 能够正常运行,另外两种种执行
脚本方式都不能正常运行,运行后发现 都不显示运行的结果。
# 出现这样问题的原因是,子进程的关系,就是 执行脚本文件的两种方式,bash 和 脚
本文件绝对路径这两种方式都是产生子进程,而问题是,产生子进程后,子进程里并
没有 编写的脚本文件里的 history 命令~!!
所以,就会发现,脚本文件执行后,就没显示什么内容,搞得跟没执行一样~!!
为什么 source history_max.sh 和 . history_max.sh 能够正常运行呢??
===>>>
因为 source 和 . 都是在当前环境里执行的,而当前环境就有 history 命令了,也就能
执行我们编写的脚本文件了~!!!!!
运行的结果是 :
source 执行的脚本文件
===>>>
. 执行的脚本文件
===>>>
# 那现在我们想 使得 四种执行脚本文件的方式 都能够正常执行,怎么办??
首先,要清楚一个文件 / root / .bash_history
这个文件是干嘛的呢 ?
===>>>
我们 默认 命令历史 就是存储在 这个文件里的~!!
所以,我们对这个 / root / .bash_history 文件进行处理就行~!!!
我们对脚本 history_max.sh 里的内容处理一下
===>>>
注意,此时脚本的内容发生变化了,脚本命令改变了~!!
处理后,四个执行脚本方式,都可以完成本题需求
===>>>
习题二 : 判断主机是否存在rhel用户,如果存在则设置密码为redhat,如果不存在则创建用户
并设置密码
思路分析 :
# 根据题意分析知,不管 rhel 用户是否存在,都得设置密码
也就是说设置密码 这条命令都得执行; 并且这条命令是在后面执行的,最起码是在
前面已经有 rhel 用户存在~!!
===>>>
echo redhat | passwd --stdin rhel
# 现在就只剩下,判断 rhel 用户是否存在了 ,若不存在还得创建 rhel 用户
根据题意。你得确保 rhel 用户存在啊
===>>>
id rhel &>> /dev/null || useradd rhel
上示命令的核心在 | | ( 或运算符 )
解释 :
要是 id rhel 这个命令 成功执行了,那状态码肯定就是 0 了,那就不执行 | | 后
面的语句了, 即 : 用户 rhel 已经存在了,那当然就不用再创建 rhel 用户了
要是 id rhel 这个命令 没成功执行,那状态码肯定就是 非零了,那就得执行 | |
后面的语句,即 : rhel 用户不存在( 这是由 id rhel 语句执行失败判断的)
useradd rhel --> 创建 用户 rhel
脚本源码 :
执行结果 :
===>>>
习题三 :通过设置变量HISTTIMEFORMAT,使得当执行history命令时,输出格式如下:
[2022-12-25 16:10:05][root]history
思路分析 :
# 本题主要就是对基础命令的考察
%F : 完整的年月日格式 eg : 2022-10-5
%T : 完整的时分秒格式 eg : 18:25:13
whoami : 显示用户名
源码 :
# 没有在脚本文件里执行,直接在 命令行 进行了一个 变量的赋值。
执行结果 :
然后再命令行 执行 history 命令
===>>>
至此,我们本题代码即是如此,有个小问题就是,如何实现永久化??
===>>>
那就是要把脚本里的命令 保存在 /etc/bash_rc 文件里
===>>>
# 我们把 HISTTIMEFORMAT 这个变量 也生成了 环境变量,这样就实现了永久化,针对
whoami 这个命令来讲就是 不管用户名是谁,都可以生成题目中的效果 。
然后我们再 source 加载一下这个文件
===>>>
至此,这样 永久化就达到了
来看看效果
# 这是 root 用户下 执行 history 命令
===>>>
# 这是 natash 用户下 执行 history 命令
===>>>
# 这是 rhel 用户下 执行 history 命令
===>>>
上示执行的结果,就是我们实现了 永久化 的结果~!!!