自动化架构-shell自动化编程(四)
今日内容:
一、脚本中常用的检查命令
1.1 概述
常用检查命令 |
作用 |
示例 |
端口 |
一般用于检查端口是否存在,能否正常连接 |
ss / netstat |
进程 |
检查进程状态、指标 |
ps / top / iotop |
网络 |
检查网络连通性 |
ping / iftop / dig |
web |
http请求 |
curl / wget |
系统全能 |
atop(all) |
|
1.2 端口检查
1.2.1 是否存在
1.2.2 能否访问
1.3 进程检查
ps 、top
1.4 网络检查
ping
iftop
1.5 web与api的测试命令
1.5.1 curl
curl:
- -v -L跟随跳转
- -H 修改请求头
- -I 只显示响应头
- -w 按照指定格式输出
- -o 输出到指定位置的文件
- -s 安静模式,一般使用管道需要加上,可以关闭下载进度显示
案例:
curl 的 POST 选项
- 输入用户名密码(ak id和secret) 获得令牌 token
- 通过令牌访问资源
- -X 请求方法
- -H 修改请求头
- -d 请求报文主体
案例:
1.5.2 wget
wget:
- -t 失败后,重复尝试次数、
- -T timeout 超时时间
- -q 不显示wget输出
- –spider 不下载文件,仅访问.
1.6 全能信息
atop的基本使用
效果:
1.7 案例
1.7.1 案例1:检查指定IP的端口能否正常访问
1)用nmap实现
测试
2)用telnet实现
测试
1.7.2 检测指定url是否可以访问
1)用curl实现
测试
2)用wget实现
利用wget的功能:
- q不输出额外内容
- –spider不下载文件,仅仅访问测试.
实现:
二、Shell编程循环
2.1 for循环
for循环分为两种格式:通用格式和C格式
2.1.1 通用格式(常用)
格式如下
候补清单可以是手动指定
也可以搭配着一些“特殊列表”使用
列表可以一次性提供多个
2.1.2 C语言格式
不太常用
格式如下
2.1.3 for循环案例
面试题:使用for循环在/oldboy目录下通过随机小写10个字母加固定字符串oldboy批量创建10个html文件,名称例如为:
实现:
测试
2.1.4 补充:生成随机字符的方法
uuidgen
mkpasswd
tr
date
echo
2.2 while循环
2.2.1 通用格式
案例01:使用while输出1..10
案例02:输出1+2+3…+100的结果
2.2.2 while死循环
死循环,会一直循环下去
案例:生成随机数字,判断数字是什么(1-100)
- 如果输入的数字比随机数大,提示大了
- 如果输入数字比随机数小,提示小了
- 如果等于提示恭喜
- 额外要求:
- 用了1-3次 超越了99.99%人
- 用了4-6次 超越80%的人
- 其他 超越了70%的人
实现:
测试
2.2.3 while循环-读取文件内容
方式一:采用exec读取文件,然后进行while循环处理
方式二:使用cat读取文件内容,然后通过管道进入,不适用于有变量传递场景使用
方式三:在while循环结尾done通过输入重定向来指定读取的文件(推荐)
2.2.3.1 方式三的实现案例
脚本
文件
测试
2.2.3.2 方式三和方式二的区别
案例
测试
可见,读取同样的文件,while循环的次数显示不一样,这是为啥?
说明(了解):
- 方法2在运行的时候因为管道,创建1个子shell,变量都存放在子shell中,子shell运行完成,消失了,变量也没了。
- 方法3运行的时候是与当前脚本在同一个shell中,所以变量都保持了,可以继续使用
2.2.4 案例:while循环分析Nginx
分析ngx访问日志找出访问量最高前5个ip及他们的访问次数,IP访问次数大于200,通过防火墙屏蔽ip。可用于防止DOS、DDOS攻击、CC攻击
DOS,拒绝式服务攻击.
DDOS,分布式拒绝式服务攻击.
CC,基于http请求攻击
步骤:
- 三剑客:分析ngx访问日志,访问次数最高的5个ip及访问次数,保存到文件中(res.txt)。
- 循环:读取res.txt文件,读取ip和次数。
- 判断:如果次数大于200 并且 之前没有屏蔽过(防火墙规则中没有这个ip)。
- 是:通过防火墙命令 iptables -t filter -I INPUT -s ip -j DROP
- 否:读取下一行
- 一直到读取完文件
实现:
补充:
- 文件的每一行的 第1列 赋值给count变量
- 文件的每一行的 第2列 赋值给ip变量
2.3 do..until循环
(很少用,了解即可)
无论条件是否满足,都会执行1次
三、shell编程-辅助
3.1 颜色
3.1.1 基本使用
给Linux命令行的字体加颜色:
各项参数解析:
-e 识别转义字符
\E 或\033 —- 表示要开启这种功能
[1;31m — [效果;颜色m
\E[0m — 颜色设置结束
3.1.2 颜色字体效果
1表示加粗,2正常的,5表示闪烁
效果,(实验这里5并没有闪,可能不同终端工具表现不同)
案例:循环输出各种颜色的字符
3.1.3 简化颜色选项
对于常用颜色可以写到环境变量中,这样使用起来比较方便
使用
也可以定义成函数
3.1.4 案例:函数方式-自定义颜色
定义函数库
调用
效果
3.2 gui(了解)
gui图形功能。
未来建议大家使用:颜色和命令cowsay实现即可