写到这里,我们千峰网络安全的第二个阶段的学习就到此结束了,学完Linux操作系统之后,感觉学习效果不太好,后期我打算专门出一期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
#!/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