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 "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=
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.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" ] && [ $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.