shell编程第四天(day036)
1.脚本常用命令
本地检查端口 ss -luntp
远程检查端口nmap -p80 www.baidu.com telnet
进程 ps top
检测连通性ping iftop dig
http请求 curl/wget
系统全能 atop/all
2.shell编程的for循环
普通形式for循环
for 变量 in 候补清单列表
do
命令
done
C语言形式for循环
for ((i=1;i<=10;i++))
do
echo $i
done
for循环案例
双重for循环打印九九乘法表
for((i=1;i<=9;i++))
do
for((j=1;j<=9;j++))
do
if [ $j -lt $i -o $j -eq $i ];then
echo -n "$j*$i=$((j*i)) "
[ $((j*i)) -lt 10 ] && echo -n " "
fi
done
echo
done
3.while循环
while 条件
do
命令
done
4.退出本次循环
continue
5.while循环读取文件
file=文件
while read line(可以改为其他名字,代表每一行)
do
命令
done <$(file)
6.案例
分析ngx访问日志找出访问量最高的前5个ip及其访问次数,ip访问次数大于200通过iptables屏蔽ip。
步骤
1.分析ngx访问日志,访问次数最高的5个ip及访问次数,保存到文件中.
2.while循环,读取res.txt文件,读取ip和次数.
3.如果次数大于200,而且防火墙规则没有这个ip,则屏蔽,已经屏蔽,则读取下一行.
4.读取直到文件结束.
#分析ngx访问日志,访问次数最高的5个ip及访问次数,保存到文件中
access_log=/server/files/access.log
result.file=/server/files/result.txt
awk '{print $1}' ${access.log} | sort|uniq -c |sort -rn|head -5 >${result.file}
#循环判断
while read line
do
ip_cnt=`echo $line|awk '{print $1}'`
ip_addr=`echo $line|awk '{print $2}'`
if [ $ip_cnt -ge 200 -a `iptables -nL | grep -wc "${ip_addr}" ` -eq 0];then
iptables -t filter -I INPUT -s $(ip_addr) -j DROP
fi
iptables -t filter -
done
done<$(result.file)
优化,可以让while读取两个变量,count和ip,这样子就不需要ip_cnt和ip_addr
while read count ip
do
echo $count $ip
done<$(result.file)