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;"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 \”[email protected]\” “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 \”[email protected]\” “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
# copyecho -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 mforiin‘seq014‘;doj=mforiin‘seq014‘;doj=mforiin‘seq014‘;doj=mforiin‘seq014‘;doj=mforiin‘seq014‘;doj= mfor i in `seq 0 14`; doj=mforiin‘seq014‘;doj=mforiin‘seq014‘;doj=mforiin‘seq014‘;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.logn1=`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\" ] && [ $y2 == \"Yes\" ]thenecho \"slave status good.\"elseecho \"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 ]; thenexit 2fi;;
–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 udeletedsuccessfully.\”n=u deleted successfully.\”n=udeletedsuccessfully.\”n=[$n+1]
else
echo “The user $u not exist.”
fi
done
if [ $n -eq 0 ]; thenexit 3fi;;
–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.