引言:我的系列博客[网络安全学习篇]上线了,小编也是初次创作博客,经验不足;对千峰网络信息安全开源的视频公开课程的学习整理的笔记整理的也比较粗糙,其实看到目录有300多集的时候,讲道理,有点怂了,所以我就想到了通过写博客(课程笔记)的形式去学习它,虽然写博客会让我多花几倍的时间去学习它,但是当我完成一篇博客所获得的成就感和你们对于我的认同感,让我很满足,能够鼓励我一天天的坚持下去,也希望和我一起学习本期视频的"同道"们也能给一直坚持下去。我们大家一起加油。由于作者本身也是网络信息安全小白,大部分知识点都是初次接触,出现对其理解不深入,不完整,甚至也会出现错误有问题的地方,希望大家谅解、留言提出指正,同时也欢迎大家来找我一起交流学习!!!
往期博客:
第一阶段:
[网络安全学习篇1]:windowsxp、windows2003、windows7、windows2008系统部署(千峰网络安全视频笔记)
[网络安全学习篇24]:漏洞与木马(千峰网络安全视频笔记 p117-p118)
第二阶段:
[网络安全学习篇26]:Linux下的命令帮助、压缩、vim、软件安装的学习
[网络安全学习篇27]:Linux操作系统的用户和组、文件及目录权限(千峰网络安全视频笔记 p134-p139)
[网络安全学习篇28]:网络地址的配置 日志文件的管理、备份及日志服务器的搭建
[网路安全学习篇30]:Nginx和Tomcat服务的搭建、Nginx+Tomcat负载均衡的实现
[网络安全学习篇31]:Linux 防火墙 iptables 中 filter(包过滤防火墙)和 nat(路由转换)详解
[网络安全学习篇32]:Linux脚本编写汇总及应用(本篇)
写到这里,我们千峰网络安全的第二个阶段的学习就到此结束了,学完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已经自启动了
参考文献: