shell编程100列

101个shell脚本
ZeroOne01关注2人评论82091人阅读2017-11-30 22:11:55
本文用于记录学习和日常中使用过的shell脚本

【脚本1】打印形状
打印等腰三角形、直角三角形、倒直角三角形、菱形

#!/bin/bash

等腰三角形

read -p "Please input the length: " n
for i in seq 1 $n
do
for ((j=$n;j>i;j–))
do
echo -n " "
done

for m in seq 1 $i
do
echo -n "* "
done
echo
done

倒直角三角形

read -p "Please input the length: " len
for i in seq 1 $len
do
for j in seq $i $len
do
echo -n "* "
done
echo
done

直角三角形

read -p "Please input the length: " len
for i in seq 1 $len
do
for((j=1;j<=$i;j++))
do
echo -n "* "
done
echo
done

菱形

read -p "Please input the length: " n

for i in seq 1 $n
do
for ((j=$n;j>i;j–))
do
echo -n " "
done
for m in seq 1 $i
do
echo -n "* "
done
echo
done

for i in seq 1 $n
do
for((j=1;j<=KaTeX parse error: Expected 'EOF', got '&' at position 16: i;j++))doecho−n&̲quot;&quot;done…?ne0]thenn=[$n-1]
else
break
fi
done

if [ $n -eq 5 ]
then
## mail.py的内容参考https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D22Z/mail.py
python mail.py "123@qq.com" “httpd service down” cat /tmp/apache.err
exit
fi
}

while :
do
t_n=ps -C httpd --no-heading |wc -l
if [ $t_n -ge 500 ]
then
/usr/local/apache2/bin/apachectl restart
if [ $? -ne 0 ]
then
check_service
fi
sleep 60
t_n=ps -C httpd --no-heading |wc -l
if [ $t_n -ge 500]
then
python mail.py "123@qq.com" “httpd service somth wrong” “the httpd process is budy.”
exit
fi
fi
sleep 10
done
【脚本23】封ip
需求: 根据web服务器上的访问日志,把一些请求量非常高的ip给拒绝掉!

分析: 我们要做的,不仅是要找到哪些ip请求量不合法,并且还要每隔一段时间把之前封掉的ip(若不再继续请求了)给解封。 所以该脚本的关键点在于定一个合适的时间段和阈值。

比如, 我们可以每一分钟去查看一下日志,把上一分钟的日志给过滤出来分析,并且只要请求的ip数量超过100次那么就直接封掉。 而解封的时间又规定为每半小时分析一次,把几乎没有请求量的ip给解封!

参考日志文件片段:

157.55.39.107 [20/Mar/2015:00:01:24 +0800] www.aminglinux.com “/bbs/thread-5622-3-1.html” 200 “-” “Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)”
61.240.150.37 [20/Mar/2015:00:01:34 +0800] www.aminglinux.com “/bbs/search.php?mod=forum&srchtxt=LNMP&formhash=8f0c7da9&searchsubmit=true&source=hotsearch” 200 “-” “Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)”
脚本实现如下:

#!/bin/bash

日志文件路径

log_file="/home/logs/client/access.log"

当前时间减一分钟的时间

d1=date -d "-1 minute" +%H:%M

当前时间的分钟段

d2=date +%M

iptables命令所在的路径

ipt="/sbin/iptables"

用于存储访问日志里的ip

ips="/tmp/ips.txt"

封ip

block(){

把日志文件中的ip过滤出来,去掉重复的ip,并统计ip的重复次数以及对ip进行排序,最后将结果写到一个文件中

grep “$d1:” $log_file |awk ‘{print $1}’ |sort -n |uniq -c |sort -n > $ips

将文件里重复次数大于100的ip迭代出来

for ip in awk '$1 > 100 {print $2}' $ips
do
## 通过防火墙规则对这些ip进行封禁
$ipt -I INPUT -p -tcp --dport 80 -s $ip -j REJECT
## 将已经封禁的ip输出到一个文件里存储
echo "date +%F-%T $ip" >> /tmp/badip.txt
done
}

解封ip

unblock(){

将流量小于15的规则索引过滤出来

for i in $ipt -nvL --line-number |grep '0.0.0.0/0' |awk '$2 < 15 {print $1}' |sort -nr
do
## 通过索引来删除规则
$ipt -D INPUT $i
done

清空规则中的数据包计算器和字节计数器

$ipt -Z
}

为整点或30分钟就是过了半个小时,就需要再进行分析

if [ $d2 == “00” ] || [ $d2 == “30” ]
then
unblock
block
else
block
fi
【脚本24】部署前端项目
最近做了一个web前端的项目,需要编写一个脚本完成项目的上线。

脚本实现如下:

#!/bin/bash

使用方法:

mmall:front_deploy.sh mmall-fe

admin:front_deploy.sh admin-fe

GIT_HOME=/developer/git-repository/ # 从git仓库拉取下来的源码的存放路径
DEST_PATH=/product/frontend/ # 项目打包后的发布路径

cd dir

if [ ! -n “$1” ]
then
echo -e “请输入要发布的项目!”
exit
fi

if [ $1 = “mmall-fe” ]
then
echo -e “=Enter mall-fe===”
cd $GIT_HOME$1
elif [ $1 = “admin-fe” ]
then
echo -e “=Enter mall-fe===”
cd $GIT_HOME$1
else
echo -e “输入的项目名没有找到!”
exit
fi

clear git dist

echo -e “=Clear Git Dist===”
rm -rf ./dist

git操作

echo -e “=git checkout master===”
git checkout master

echo -e “=git pull===”
git pull

npm install

echo -e “=npm install===”
npm install --registry=https://registry.npm.taobao.org

npm run dist

echo -e “=npm run dist===”
npm run dist

if [ -d “./dist” ]
then
# backup dest
echo -e “=dest backup===”
mv $DEST_PATH$1/dist $DEST_PATH$1/dist.bak

# copy
echo -e "===========copy============="
cp -R ./dist $DEST_PATH$1

echo result

echo -e “=Deploy Success===”

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

else
echo -e “=Deploy Error===”
fi
【脚本25】找规律打印数字
请详细查看如下几个数字的规律,并使用shell脚本输出后面的十个数字。

10 31 53 77 105 141 …….

试题解析:
我想大多数人都会去比较这些数字的差值:

10 31 53 77 105 141
21 22 24 28 36
但是这个差值看,并没有什么规律,而我们再仔细看的时候,发现这个差值的差值是有规律的:

10 31 53 77 105 141
21 22 24 28 36
1 2 4 8
脚本实现:

#! /bin/bash
x=21
m=10
echo m f o r i i n ‘ s e q 014 ‘ ; d o j = m f o r i i n ‘ s e q 014 ‘ ; d o j = m f o r i i n ‘ s e q 014 ‘ ; d o j = mforiin‘seq014‘;doj=mforiin‘seq014‘;doj= mfor i in `seq 0 14`; doj= mforiinseq014;doj=mforiinseq014;doj=mforiinseq014;doj=md5b]thenecho"f changed."
fi
else
echo "$f deleted. "
fi
done
【脚本33】统计网卡流量
写一个脚本,检测你的网络流量,并记录到一个日志里。需要按照如下格式,并且一分钟统计一次(只需要统计外网网卡,假设网卡名字为eth0):

2017-08-04 01:11
eth0 input: 1000bps
eth0 output : 200000bps
################
2017-08-04 01:12
eth0 input: 1000bps
eth0 output : 200000bps
提示:使用sar -n DEV 1 59 这样可以统计一分钟的平均网卡流量,只需要最后面的平均值。另外,注意换算一下,1byt=8bit

实现代码:

#!/bin/bash

while :
do
LANG=en
DATE=date +"%Y-%m-%d %H:%M"
LOG_PATH=/tmp/traffic_check/date +%Y%m
LOG_FILE=$LOG_PATH/traffic_check_date +%d.log
[ -d $LOG_PATH ] || mkdir -p $LOG_PATH
echo " $DATE" >> $LOG_FILE
sar -n DEV 1 59|grep Average|grep eth0 \
|awk ‘{print “\n”,$2,"\t",“input:”,$510008,“bps”,
“\t”,"\n",$2,"\t",“output:”,$610008,“bps” }’ \
>> $LOG_FILE
echo “#####################” >> $LOG_FILE
done
【脚本34】系统-批量杀进程
今天发现网站访问超级慢,top看如下:
101个shell脚本

有很多sh进程,再ps查看:
101个shell脚本

这个脚本,运行很慢,因为制定了cron,上一次还没有运行完,又有了新的运行任务。太多肯定会导致系统负载升高。当务之急就是先把这些在跑的给kill掉。那么我们可以使用一条命令,直接杀死所有的sh。

命令如下:

ps aux |grep clearmem.sh |grep -v grep|awk ‘{print $2}’|xargs kill
【脚本35】判断是否开启80端口
写一个脚本判断你的Linux服务器里是否开启web服务?(监听80端口)如果开启了,请判断出跑的是什么服务,是httpd呢还是nginx又或者是其他的什么?

实现代码:

#!/bin/bash
port=netstat -lnp | grep 80
if [ -z “port” ]; then
echo “not start service.”;
exit;
fi
web_server=echo $port | awk -F'/' '{print $2}'|awk -F : '{print $1}'
case $web_server in
httpd )
echo “apache server.”
;;
nginx )
echo “nginx server.”
;;

  • )
    echo “other server.”
    ;;
    esac
    【脚本36】监控mysql服务
    假设,当前MySQL服务的root密码为123456,写脚本检测MySQL服务是否正常(比如,可以正常进入mysql执行show processlist),并检测一下当前的MySQL服务是主还是从,如果是从,请判断它的主从服务是否异常。如果是主,则不需要做什么。

实现代码:

#!/bin/bash
Mysql_c=“mysql -uroot -p123456”
$Mysql_c -e “show processlist” >/tmp/mysql_pro.log 2>/tmp/mysql_log.err
n=wc -l /tmp/mysql_log.err|awk '{print $1}'

if [ $n -gt 0 ]
then
echo “mysql service sth wrong.”
else

$Mysql_c -e "show slave status\G" >/tmp/mysql_s.log
n1=`wc -l /tmp/mysql_s.log|awk '{print $1}'`

if [ $n1 -gt 0 ]
then
y1=grep 'Slave_IO_Running:' /tmp/mysql_s.log|awk -F : '{print $2}'|sed 's/ //g'
y2=grep 'Slave_SQL_Running:' /tmp/mysql_s.log|awk -F : '{print $2}'|sed 's/ //g'

if [ $y1 == "Yes" ] &amp;&amp; [ $y2 == "Yes" ]
then
    echo "slave status good."
else
    echo "slave down."
fi

fi

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

fi
【脚本37】带选项的用户脚本
要求如下:

只支持三个选项 ‘–del’ ‘–add’ –help输入其他选项报错。
使用‘–add’需要验证用户名是否存在,存在则反馈存在。且不添加。 不存在则创建该用户,切>添加与该用户名相同的密码。并且反馈。
使用‘–del’ 需要验证用户名是否存在,存在则删除用户及其家目录。不存在则反馈该用户不存>在。
–help 选项反馈出使用方法
支持以,分隔 一次删除多个或者添加多个用户。
能用echo $? 检测脚本执行情况 成功删除或者添加为0,报错信息为其他数字。
能以,分割。一次性添加或者 删除多个用户。 例如 adddel.sh –add user1,user2,user3…….
不允许存在明显bug。
代码参考:

#!/bin/bash
#written by aming.

if [ $# -eq 0 -o $# -gt 2 ]
then
echo “use $0 --add username or $0 --del username or $0 --help.”
exit 1
fi

case $1 in
–add)
n=0
for u in echo $2|sed 's/,/ /g'; do
if awk -F: '{print KaTeX parse error: Expected 'EOF', got '}' at position 41: …ed 'EOF', got '}̲' at position 2…u"
then
echo “The user $u exist.”
else
useradd KaTeX parse error: Expected 'EOF', got '&' at position 8: uecho−e&̲quot;uecho−e&qu…uaddedsuccessfully."n=[$n+1]
fi
done

    if [ $n -eq 0 ]; then
        exit 2
    fi
    ;;

–del)
n=0
for u in echo $2|sed 's/,/ /g'; do
if awk -F: '{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 1}̲' /etc/passwd|g…u"
then
userdel -r $u
echo "The user u d e l e t e d s u c c e s s f u l l y . " n = u deleted successfully." n= udeletedsuccessfully."n=[$n+1]
else
echo “The user $u not exist.”
fi
done

if [ $n -eq 0 ]; then
        exit 3
fi
;;

–help)
echo -e “–add can add user,and the passwd is the same as username.
It can add multiuser such as --add user1,user2,user3…”
echo “–del cat delete user.It can delete user such as --del user1,user2,user3…”
;;

*)
echo “use $0 --add username or $0 --del username or $0 --help.”
exit 1
;;

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

esac
【脚本38】被3整除
写一个脚本: 计算100以内所有能被3整除的正整数的和

代码参考:

#!/bin/bash
sum=0
for i in {1…100};do
if [ [ [ [ [[ [ [[[[i-1]
e_df /data/1.log.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值