[网络脚本]:Linux脚本编写汇总及应用

[网络脚本]:Linux脚本编写汇总及应用

 
脚本
 
Linux中的脚本其实就类似我们在windows系统中编写的批处理,那么我们如何去学习他呢?
 
我们这里主要通过应对各种场景的要求,编写相应的脚本去实现的过程中,我们去一步步的认识脚本编写的各种语法。这些语法的含义其实在我们以前学过的编程语言中,已经了解了。这里,我们主要是了解和学习其语法结构即可,你会发现,学起来非常轻松,也很有意思......
 
一个简单的脚本
 
场景设定如下:
 
    上午9点 要求设定eth0网卡 ip
 
    192.168.1.100/24
 
    192.168.1.254
 
    下午2点要求设定eth0网卡 ip
 
    172.16.1.100/24
 
    172.16.1.254
 
实现流程
 
新建一个文件
 
  •     vim fixip.sh

image

 
    #!/bin/bash
    cd etc/sysconfig/network-scripts/
    echo
    echo "DEVICE=eth0" > ifcfg-eth0
    echo "TYPE=Ethernet" >> ifcfg-eth0
    echo "ONBOOT=yes" >> ifcfg-eth0
    echo "BOOTPROTO=static" >> ifcfg-eth0
    echo "IPADDR=192.168.1.100" >> ifcfg-eth0
    echo "NATMASK=255.255.255.0" >> ifcfg-eth0
    echo "GATEWAY=192.168.1.254" >> ifcfg-eth0
    ifdown eth0
    ifup eth0
 
    这里解释下:
 
    #!bin/bash   指定用bash解释器来解释脚本语言
 
添加运行权限
 
  •     chmod +x fixip.sh
 
执行(在当前目录下)
 
  •     ./fixip.sh
 
公司会随机指定不同的ip进行修改
 
优化脚本为交互式脚本,就引出了我们下面要讲的变量赋值
 
变量赋值
 
首先,我们来看一下这几行命令,执行之后的结果
 

image

 
 A 顾名思义就是我们定义的变量了,我们给其赋值,再通过$A调出它所表示的值(字符串)
 

image

 
    read指令 结合我们的变量,就可以实现将用户输入的值赋给变量的过程
 
    结构:
 
    read -p " " 变量 
 
通过我们的变量和read对前面的脚本进行优化升级,使其更实用且贴合人性化
 
    #!/bin/bash
    read -p "please input ipaddr:"IP
    read -p "please input netmask:"MASK
    read -p "please input gateway:"WAY
    cd etc/sysconfig/network-scripts/
    echo
    echo "DEVICE=eth0" > ifcfg-eth0
    echo "TYPE=Ethernet" >> ifcfg-eth0
    echo "ONBOOT=yes" >> ifcfg-eth0
    echo "BOOTPROTO=static" >> ifcfg-eth0
    echo "IPADDR=$IP" >> ifcfg-eth0
    echo "NATMASK=$MASK" >> ifcfg-eth0
    echo "GATEWAY=$WAY" >> ifcfg-eth0
    ifdown eth0
    ifup eth0
 
    注:添加变量之后,echo后面必须是双引号,不能是单引号了
 
    变量前面不要忘了加$
 
if判断语句
 
结构
 
if单分支结构
 
if 条件
then 成立子语句
fi
 
if 双分支结构
 
if 条件
then 成立子语句
else 不成立子语句
fi
 
if 多分支结构
 
if 条件
then 成立子语句
elif 条件
then 成立子语句
else 不成立子语句
fi
 
实例
 
接下来我们编写一个简单的单分支判断脚本
 
    注:Linux中  大于 -gt     小于 -lt     等于 -eq
 
同样,先创建一个sh文件
 
  •     vim if.sh
 
    #!/bin/bash
    if [ 3 -lt 5 ]
    then echo "yes"
    fi
 
赋权
 
  •     chmod +x if.sh

image

 
再来看一个多分支的例子
 
   #!/bin/bash
    read -p "please input a num:"NUM
    if [ $NUM -lt 5 ]
    then echo "lt"
    elif [ $NUM -eq 10 ]
    then echo "eq"
    else echo "gt"
    fi
 

image

 
检测内网主机存活状态
 
我们平时的ping操作,我们可以对其进行修饰,改变其特定的输出显示:
 
  •     -c 指定其发送几个包
  •     -i 发间隔时间
  •     -w 等待响应时间
 

image

 
那我们的ping语句的结果可以作为if的条件吗?可以
 
我们要将其输出的结果不显示
 
  •     &> 文件 将前面的输出结果导入到别的地方
 
  •     ping -c2 -i0.2 -w2 12.34.56.78 &> /dev/null

image

 
新建一个文件ping.sh
 
  •     vim ping.sh
 
    #!/bin/bash
    if `ping -c2 -i0.2 -w2 12.34.56.79 &> /dev/null`
    then echo "yes"
    else echo "no"
    fi
 
    注:` 这个符号如何在键盘上打出  英文状态下:键盘上数字键1的左边
 
同样赋权执行
 
  •     chmod +x ping.sh
 
这里提前声明以下,我们ping的这个ip原来就是通的
 

image

 
优化:
 
    #!/bin/bash
    read -p "please input ipaddr:"IP
    if `ping -c2 -i0.2 -w2 $IP &> /dev/null`
    then echo "$IP is up"
    else echo "$IP is down"
    fi
 
测试成功
 

image

 
局限性:
 
我们测试一个主机可以,但是一个网段就不行了
 
这就要用到我们的循环,下面,我们就来介绍循环语句
 
循环语句 for wile
 
  •     for和wile的区别
  •     for 根据循环的次数(取值列表)循环
  •     wile 根据条件循环
 
我们在屏幕上直接输出{1..10},就可以得到以下结果
 

image

 
for格式
 
for 变量 in 取值列表
do
    子语句
done
 
for实例
 
简单的循环脚本
 
  •     vim xun.sh
 
我相信大家在之前已经接触过编程语言了,我就不做详细著述了,直接上代码
 
    #!/bin/bash
    for i in {1..10}
    do
        echo $i
    done
 

image

 
wile格式
 
while 条件
do
   子语句
done
 
while实例
 
    #!/bin/bash
    NUM=0
    while [ $NUM -lt 3 ]
    do
        let NUM++
        echo $NUM
    done
 
    注:let NUM++  相当于 let NUM=NUM+!
 

image

 
检测内网主机存活装态(升级)
 
继续我们回到前面的探测主机存活,这一次我们要实现在真实的环境中,探测局域网的主机存活状态
 
将我们的网络属性配置到桥接模式
 

image

 
修改网卡配置
 
  •     vim /etc/sysconfig/network-scripts/ifcfg-eth0

image

 
  •     ifdown eth0
  •     ifup eth0

image

 
  •     vim ping.sh
 
for实现
 
    #!/bin/bash
    NET=10.0.110.
    for i in {1..254}
    do
        if `ping -c2 -i0.2 -w2 $NET$IP &> /dev/null`
        then echo -e "$NET$IP is \033[31mup\033[0m"
        else echo -e "$NET$IP is \033[32mdown\033[0m"
        fi
    done
 

image

 
while实现:
 
    #!/bin/bash
    NET=10.0.110.
    IP=200
    while [$IP -lt 254 ]
        lxxxet IP=IP+1
        if `ping -c2 -i0.2 -w2 $NET$IP &> /dev/null`
        then echo -e "$NET$IP is \033[31mup\033[0m"
        else echo -e "$NET$IP is \033[32mdown\033[0m"
        fi
    done
 

image

 
case语句
 
    案例
 
    ./case.sh centos
 
    redhat
 
    ./case.sh redhat
 
    centos
 
    ./case xxxx
 
    usage case.sh {redhat|centos}
 
使用case语句实现以上案例
 
    case $1 in
    redhat)
        echo "centos"
        ;;
    centos)
        echo "redhat"
        ;;
    *)
        echo "Usage $0 {redhat|centos}"
    esac
 
赋权
 
  •     chmod +x case.sh

image

 
case格式
 
case 变量 in
模式1)
   子语句
   ;;
*)
   子语句
   ;;
esac
 
函数
 
将一部分代码存储到一个变量中
 
设计一个函数名字为A
 
运行A时屏幕输出OK
 

image

 
可以通过
 
echo $?
 
得到函数的返回值(return)
 
探测内网主机存活状态(再升级)
 
继续我们回到前面的探测主机存活,这一次我们要实现在真实的环境中,探测局域网的所有主机存活状态
 
    redhat(){
        echo cetos
        return 0
    }
    centos(){
        echo redhat
        return 0
    }
    case $1 in
    redhat)
        redhat
        ;;
    centos)
        centos
        ;;
    *)
        echo "Usage $0 {redhat|centos}"
    esac
     

image

 
分析apache自启动脚本
 

image

apache的启动函数
 

image

 
apache的关闭函数
 

image

 
这些是不是看起来很熟悉,都是我们前面学的编写的
 

image

 

image

 
接下来我们就来编写nginx的自启动脚本
 
Nginx自启动脚本
 
首先我们要在/etc/init.d/目录下编写我们Nginx的启动脚本nginxd
 

image

 
    #!/bin/bash
    nginx=/usr/local/nginx/sbin/nginx
    start(){
        echo "nginx starting .... [OK] "
        $nginx
    }
    start
 

image

 
优化:
 
    #!/bin/bash
    nginx=/usr/local/nginx/sbin/nginx
    start(){
        echo "nginx starting .... [OK] "
        $nginx
    }
    status(){
        if `ss -antpl | grep nginx > /dev/null`
        then echo "nginx starting .... "
        else echo "nginx stoping .... "
        fi
    }
    stop(){
        echo "nginx stoping .... [OK] "  
        $nginx -s stop
 
 
    }
    case $1 in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart
        stop
        start
        ;;
    *)
        echo "Usage :$0 {start|stop|restart}"
    esac
 

image

 
接下来,我们让它永久启动
 
打开我们编写好的nginxd脚本,添加下面两行
 

image

 
加入chkconfig list
 
  •     chkconfig --add nginxd

image

 
默认都是关闭的off
 
我们将5级别打开on
 
  •     chkconfig --list nginxd on
 
好了,我们的5级别已经开启了
 
接下来,我们重启操作系统
 
  •     reboot

image

 
可以看到我们的nginx已经自启动了。
 
posted @ 2021-06-21 18:12  jpSpaceX  阅读(452)  评论(0)    收藏  举报