[网络安全学习篇32]:Linux脚本编写汇总及应用

写到这里,我们千峰网络安全的第二个阶段的学习就到此结束了,学完Linux操作系统之后,感觉学习效果不太好,后期我打算专门出一期Linux的汇总,也算是再强化一下吧,毕竟对于我们学安全的,尤其是后面的渗透测试这一块,对Linux的功底要高。

目录

 

脚本

一个简单的脚本

实现流程

变量赋值

if判断语句

结构

实例

检测内网主机存活状态

循环语句 for wile

for格式

for实例

wile格式

while实例

检测内网主机存活装态(升级)

case语句

case格式

函数

探测内网主句存活状态(再升级)

Nginx自启动脚本


脚本

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

#!/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进行修改

优化脚本为交互式脚本,就引出了我们下面要讲的变量赋值

 

变量赋值

首先,我们来看一下这几行命令,执行之后的结果

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

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

再来看一个多分支的例子

#!/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

检测内网主机存活状态

我们平时的ping操作,我们可以对其进行修饰,改变其特定的输出显示:

-c 指定其发送几个包

-i 发间隔时间

-w 等待响应时间

那我们的ping语句的结果可以作为if的条件吗?可以

我们要将其输出的结果不显示

&> 文件 将前面的输出结果导入到别的地方

  • ping -c2 -i0.2 -w2 12.34.56.78 &> /dev/null

新建一个文件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原来就是通的

优化:

#!/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

测试成功

局限性:

我们测试一个主机可以,但是一个网段就不行了

这就要用到我们的循环,下面,我们就来介绍循环语句

循环语句 for wile

for和wile的区别

for 根据循环的次数(取值列表)循环

wile 根据条件循环

 我们在屏幕上直接输出{1..10},就可以得到以下结果

for格式

for 变量 in 取值列表

do

    子语句

done

for实例

简单的循环脚本

  • vim xun.sh

我相信大家在之前已经接触过编程语言了,我就不做详细著述了,直接上代码

#!/bin/bash
for i in {1..10}
do 
    echo $i
done

wile格式

while 条件

do

   子语句

done

while实例

#!/bin/bash
NUM=0
while [ $NUM -lt 3 ]
do
    let NUM++
    echo $NUM
done

注:let NUM++  相当于 let NUM=NUM+!

检测内网主机存活装态(升级)

继续我们回到前面的探测主机存活,这一次我们要实现在真实的环境中,探测局域网的主机存活状态

将我们的网络属性配置到桥接模式

修改网卡配置

  • vim /etc/sysconfig/network-scripts/ifcfg-eth0

  • ifdown eth0
  • ifup eth0

  • 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

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


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

case格式

case 变量 in

模式1)

   子语句

   ;;

*)

   子语句

   ;;

esac

函数

将一部分代码存储到一个变量中

设计一个函数名字为A

运行A时屏幕输出OK

可以通过

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
 

分析apache自启动脚本

apache的启动函数

apache的关闭函数

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

接下来我们就来编写nginx的自启动脚本

Nginx自启动脚本

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

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

优化:

#!/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

接下来,我们让它永久启动

打开我们编写好的nginxd脚本,添加下面两行

加入chkconfig list

  • chkconfig --add nginxd

默认都是关闭的off

我们将5级别打开on

  • chkconfig --list nginxd on

好了,我们的5级别已经开启了

接下来,我们重启操作系统

  • reboot

可以看到我们的nginx已经自启动了


参考文献:

千峰网络安全视频公开课:https://www.bilibili.com/video/BV1i7411G7vm?p=158

发布了58 篇原创文章 · 获赞 28 · 访问量 3712

猜你喜欢

转载自blog.csdn.net/weixin_43252204/article/details/105569901