当前位置:   article > 正文

Shell—编程实战_shell 高阶开发实战,轻松应对集群化,分布式环境

shell 高阶开发实战,轻松应对集群化,分布式环境

前言

Shell脚本编程的灵活运用需要有对脚本基础,不同的语句组合应用具有十分熟悉的理解。接下来就通过一些实际项目来更加深刻的体会Shell在生活中的应用

一、脚本编程

1.1 脚本编程步骤

1、需求分析
2、命令测试
3、脚本编程
4、测试调优

1.2 脚本步骤解析

1)、需求分析
根据系统管理的需求,分析脚本要实现的功能、功能实现的层次、实现的命令与语句等
2)、命令测试
将要用到的命令逐个进行测试,以决定使用的选项、要设置的变量等
3)、脚本编程
将测试好的命令写入到脚本文件中,并通过各种语句将命令执行的结果保存、判断或者发出报警等
4)、调试优化
对脚本进行测试,并根据结果进行优化
建议一边编程一边调试,以减少错误的发生

二、项目实战

项目一:MAC记录与端口扫描脚本

1.1 企业环境说明

随着业务的不断发展,某公司所使用的Linux服务器也越来越多。在系统管理和维护过程中,经常需要编写一些实用的小脚本,以辅助运维工作,提高工作效率

1.2 需求描述

1、编写名妁system.sh的脚本,记录局域网中各主机的MAC地址,保存到/etc/ethers文件中;若此文件已存在,应先转移进行备份;每行一条记录,第1列为IP地址,第2列为对应的MAC地址
2、检查有哪些主机开启了匿名FTP服务,扫描对象为/etc/ethers文件中的所有IP地址,扫描的端口为21

1.3 命令类型

分析:记录局域网中各主机的MAC地址;检查有哪些主机开启了匿名FTP服务
ping -c 3 -i 0.2 -w 1 ip :发送MAC地址解析请求
arp -n:记录MAC
awk :打印ip与MAC地址
使用wget下载的方法测试FTP服务

1.4 项目流程

[root@server1 ~]# ping -c 3 -i 0.2 -W 3 20.0.0.11 > a.txt
[root@server1 ~]# cat a.txt
[root@server1 ~]# arping -c 3 -I ens33 -w 3 20.0.0.11 > a.txt
[root@server1 ~]# cat a.txt
[root@server1 ~]# arping -c 1 -I ens33 -w 3 20.0.0.11 > a.txt
[root@server1 ~]# cat a.txt
-c:连接次数
-i:时间间隔
-I:使用网卡
-w:超时时间
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
[root@server1 ~]# awk '{print $4,$5}' a.txt > b.txt
[root@server1 ~]# cat b.txt
  • 1
  • 2

两个主机安装ftp,查看21端口状态

[root@server1 ~]# yum -y install vsftpd
[root@server1 ~]# systemctl start vsftpd
[root@server1 ~]# netstat -anpt | grep 21
[root@server2 ~]# yum -y install vsftpd    
[root@server2 ~]# systemctl start vsftpd
[root@server2 ~]# netstat -napt | grep 21
[root@server2 ~]# nmap -p 21 20.0.0.10    查看对应主机21端口是否开启
[root@server2 ~]# nmap -p 21 20.0.0.10 &> /dev/null
[root@server2 ~]# wget ftp://20.0.0.10      匿名下载,下载文件名为index.html
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

选择一台新的进行shell脚本测试
1.进行记录在线用户并测试其是否开放21号端口

[root@client1 ~]# vi system.sh
#!/bin/bash
# 记录在线用户并测试其是否开放21号端口
net="20.0.0."                                 定义变量地址段
file=/etc/ethers                              义变量记录文件位置
[ -f /etc/ethers ] && cp -f $file $file.bak   文件存在判断,存在备份
add=1                                         循环测试的起始变量
while [ $add -le 20 ]                         循环条件
do                               20.0.0.   1
   ping -c 3 -i 0.2 -w 1 ${net}${add} &> /dev/null    
   if [ $? -eq 0 ]                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   追加
   then arp -n | grep ${net}${add} | awk '{print $1,$3}' >> $file   
   fi 以数字形式显示
   let add++
done
[root@client1 ~]# chmod +x system.sh 
[root@client1 ~]# ./system.sh 
[root@client1 ~]# sort -u /etc/ethers   
sort -u:等同于uniq,表示相同的数据仅显示一行
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

2.进行ftp在线测试

[root@client1 ~]# vi system.sh
#!/bin/bash
# 记录在线用户并测试其是否开放21号端口
net="20.0.0."
file=/etc/ethers
[ -f /etc/ethers ] && cp -f $file $file.bak
add=1
while [ $add -le 20 ]
do
   ping -c 3 -i 0.2 -w 1 ${net}${add} &> /dev/null
   if [ $? -eq 0 ]
   then arp -n | grep ${net}${add} | awk '{print $1,$3}' >> $file
   fi
   let add++
done
sort -u $file >> /root/file1.txt
target=$(awk '{print $1}' /root/file1.txt)
for ip in $target
do
   wget ftp://$ip &> /dev/null                  匿名下载
   if [ $? -eq 0 ]                                      如果下载成功
   then echo "$ip 主机ftp开启"              
   rm -rf index.html                       删除下载的文件。因为每次测试下载的都是它  
   fi
done
[root@client1 ~]# chmod +x system.sh 
[root@client1 ~]# ./system.sh 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

项目二:开发系统监控脚本

2.1 企业环境说明

某公司随着业务的不断发展,所使用的Linux服务器也越来越多。管理员希望编写一个简单的性能监控脚本,放到各服务器中,当监控指标出现异常时发送告警邮件

2.2 需求描述

编写名为sysmon.sh的Shell监控脚本
监控内容包括CPU使用率,内存使用率,根分区的磁盘占有率
百分比只需精确到个位,如7%,12%,23%等
出现以下任意情况时告警:磁盘占有率超过90%,CPU使用率超过80%,内存使用率超过90%,告警邮件通过mail命令发送到指定邮箱

2.3 思路与命令类型

分析:监控内容包括CPU使用率,内容使用率,根分区的磁盘占有率
df命令
awk命令
mpstat命令(需安装sysstat软件包)
free命令

2.4 项目流程

1.磁盘占有率

[root@client1 ~]# df -Th | grep '/$'
[root@client1 ~]# df -Th | grep '/$' | awk '{print $6}'
[root@client1 ~]# df -Th | grep '/$' | awk '{print $6}' | awk -F% '{print $1}'
[root@client1 ~]# disk=$(df -Th | grep '/$' | awk '{print $6}' | awk -F% '{print $1}')
  • 1
  • 2
  • 3
  • 4

2.CPU使用率

[root@client1 ~]# mpstat 
[root@client1 ~]# mpstat | tail -1 | awk '{print $12}'
[root@client1 ~]# mpstat | tail -1 | awk '{print $12}' | awk -F. '{print $1}
[root@client1 ~]# expr 100 - $(mpstat | tail -1 | awk '{print $12}' | awk -F. '{print $1}')
[root@client1 ~]# CPU=$(expr 100 - $(mpstat | tail -1 | awk '{print $12}' | awk -F. '{print $1}'))
  • 1
  • 2
  • 3
  • 4
  • 5

3.内存使用率

[root@client1 ~]# free -m
[root@client1 ~]# free -m | grep "Mem:" | awk '{print $7}'
[root@client1 ~]# free -m | grep "Mem:" | awk '{print $2}'
[root@client1 ~]# expr $(free -m | grep "Mem:" | awk '{print $7}') / $(free -m | grep "Mem:" | awk '{print $2}')
[root@client1 ~]# expr $(free -m | grep "Mem:" | awk '{print $7}') \* 100 / $(free -m | grep "Mem:" | awk '{print $2}')
mem=$(expr $(free -m | grep "Mem:" | awk '{print $7}') \* 100 / $(free -m | grep "Mem:" | awk '{print $2}'))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

4.配置文件

[root@client1 ~]# rpm -qa mailx
mailx-12.5-16.el7.x86_64
[root@client1 ~]# vi /etc/mail.rc 
set from=***********@qq.com  发送邮箱地址
set smtp=smtp.qq.com       邮箱使用的smtp服务器的域名
set smtp-auth-user=1609325444@qq.com  smtp邮件发送时登录的账号
set smtp-auth-password=........    授权码
set smtp-auth=login           smtp的状态,登录状态
[root@client1 ~]# echo "122333" | mail -s "test" ***********@qq.com
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

5.编辑配置告警脚本

[root@client1 ~]# vim sysmon.sh
#!/bin/bash
# 磁盘占有率超过90%CPU使用率超过80%,内存使用率超过90%告警发送邮件
disk=$(df -Th | grep '/$' | awk '{print $6}' | awk -F% '{print $1}')
CPU=$(expr 100 - $(mpstat | tail -1 | awk '{print $12}' | awk -F. '{print $1}'))
mem=$(expr $(free -m | grep "Mem:" | awk '{print $7}') \* 100 / $(free -m | grep "Mem:" | awk '{print $2}'))
A=/root/alert.txt
B=*************@qq.com
if [ $disk -ge 90 ]
then echo "磁盘占有率超过90%" >> $A
fi
if [ $CPU -ge 80 ]
then echo "CPU使用率超过80%" >> $A
fi
if [ $mem -ge 90 ]
then echo "内存使用率超过90%" >> $A
fi
if [ -f $A ]
then
cat $A | mail -s "alert report" $B
rm -rf $A
fi
[root@client1 ~]# chmod +x sysmon.sh 
[root@client1 ~]# ./sysmon.sh 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

项目三:实现dns及apache服务的一键化部署

3.1 需求描述

要求apche服务器绑定域名,客户机实现访问。

3.2 思路与命令类型

首先配置脚本文件,由于DNS服务配置需要较多的文件设置。可以先准备相应文件,以便配置时调用。

3.3 项目流程

文件1:1912zf.txt (正反向配置文件)

zone "aa.com" IN {
        type master;   
        file "aa.com.zone";  
       allow-transfer { 192.168.6.12; };
        also-notify { 192.168.6.12; };
};

zone "6.168.192.in-addr.arpa" IN {
        type master;                            
        file "aa.com.local";
        allow-transfer { 192.168.6.12; };
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

文件2:http.txt (网页配置)

<html><title>web1</title><body><h1>good!!!</h1></body></html>
  • 1

文件3:local.txt(反向解析文件配置)

$TTL 1D
@       IN SOA  aa.com. rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      aa.com.
        A       192.168.6.11
11 IN  PTR     www.aa.com.
12 IN  PTR     ftp.aa.com. 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

文件4:zone.txt(正向解析文件配置)

$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
             NS      @
              A       192.168.6.11
www  IN A      192.168.6.11
ftp      IN A      192.168.6.12           
mail    IN CNAME www     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

文件5:服务脚本配置

[root@server2 ~]# vi dns.sh
#!/bin/bash
# dns缓存服务器
A=/var/named
B=/etc/named.conf
C=/etc/named.rfc1912.zones
D=/var/named/aa.com.zone
E=/var/named/aa.com.local
                                        apache服务配置
yum -y install httpd
[ -e /var/www/html/index.html ] || touch /var/www/html/index.html
F=/var/www/html/index.html
chmod 755 $F
cat /root/http.txt > $F

yum -y install bind*                     修改主配置文件        
sed -i -e 's/listen-on port 53 { 127.0.0.1; };/listen-on port 53 { 192.168.6.11; };/g' $B
sed -i -e '/allow-query/s/{.*}/{ any; }/g' $B

cat /root/1912zf.txt >> $C                  区域配置

cp -p $A/named.localhost $A/aa.com.zone     区域文件
cp -p $A/named.loopback $A/aa.com.local

cat /root/local.txt > $E                  调用配置文件
cat /root/zone.txt > $D

sed -i '1anameserver 192.168.6.11' /etc/resolv.conf  添加ip地址指向
sed -i '1{H;d};2G' /etc/resolv.conf

systemctl restart named.service           服务启动
systemctl restart httpd

systemctl start named
nslookup www.aa.com        
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/197391
推荐阅读
相关标签
  

闽ICP备14008679号