写到这里,我们千峰网络安全的第二个阶段的学习就到此结束了,学完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 wilefor和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
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.shfor实现
#!/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.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