(1)查找字母数小于6的单词
用shell打印下面这句话中字母数小于6的单词。
Bash also interprets a number of multi-character options.
1
2
3
4
5
6
7
8
|
#!/bin/bash
for
s
in
Bash also interprets a number of multi-character options
do
n=`
echo
$s|
wc
-c`
if
[ $n -lt 6 ]
then
echo
$s
fi
done
|
(2)输入数字执行对应命令
写一个脚本实现如下功能: 输入一个数字,然后运行对应的一个命令。显示命令如下:cmd meau* 1—date 2–ls 3–who 4–pwd 当输入1时,会运行date, 输入2时运行ls, 依此类推。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#! /bin/bash
echo
"*cmd meau** 1---date 2--ls 3--who 4--pwd"
read
-p
"please input a number 1-4: "
n
case
$n
in
1)
date
;;
2)
ls
;;
3)
who
;;
4)
pwd
;;
*)
echo
"Please input a number: 1-4"
;;
esac
|
(3)监控httpd进程
在服务器上,写一个监控脚本:
每隔10s去检测一次服务器上的httpd进程数,如果大于等于500的时候,就需要自动重启一下apache服务,并检测启动是否成功?
若没有正常启动还需再一次启动,最大不成功数超过5次则需要理解发邮件通知管理员,并且以后不需要再检测!
如果启动成功后,1分钟后再次检测httpd进程数,若正常则重复之前操作(每隔10s检测一次),若还是大于等于500,那放弃重启并需要发邮件给管理员,然后自动退出该脚本。假设其中发邮件脚本为之前咱们使用的 mail.py
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
34
35
36
|
#!/bin/bash
check_service()
{
n=0
for
i
in
`
seq
1 5`
do
/usr/local/apache2/bin/apachectl
restart 2>
/tmp/apache
.err
if
[ $? -
ne
0 ]
then
n=$[$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 mai.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
fi
sleep
10
done
|
(4)封ip
需求: 根据web服务器上的访问日志,把一些请求量非常高的ip给拒绝掉!
分析: 我们要做的,不仅是要找到哪些ip请求量不合法,并且还要每隔一段时间把之前封掉的ip(若不再继续请求了)给解封。 所以该脚本的关键点在于定一个合适的时间段和阈值。
比如, 我们可以每一分钟去查看一下日志,把上一分钟的日志给过滤出来分析,并且只要请求的ip数量超过100次那么就直接封掉。 而解封的时间又规定为每半小时分析一次,把几乎没有请求量的ip给解封!
1
2
3
4
|
参考日志文件片段:
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)"
|
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
|
#! /bin/bash
logfile=
/home/logs/access
.log
d1=`
date
-d
"-1 minute"
+%H:%M`
d2=`
date
+%M`
ipt=
/sbin/iptables
ips=
/tmp/ips
.txt
block(){
grep
"$d1:"
$logfile|
awk
'{print $1}'
|
sort
-n |
uniq
-c |
sort
-n >$ips
for
ip
in
`
awk
'$1>100 {print $2}'
$ips`;
do
$ipt -I INPUT -p tcp --dport 80 -s $ip -j REJECT
echo
"`date +%F-%T` $ip"
>>
/tmp/badip
.txt
done
}
unblock(){
for
i
in
`$ipt -nvL --line-numbers |
grep
'0.0.0.0/0'
|
awk
'$2<15 {print $1}'
|
sort
-nr`;
do
$ipt -D INPUT $i
done
$ipt -Z
}
if
[ $d2 ==
"00"
] || [ $d2 ==
"30"
];
then
unblock
block
else
block
fi
|
(5)找规律打印数字
请详细查看如下几个数字的规律,并使用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
1
2
3
4
5
6
7
8
9
10
|
#! /bin/bash
x=21
m=10
echo
$m
for
i
in
`
seq
0 14`;
do
j=$[2**$i]
m=$[$m+$x]
echo
$m
x=$[$x+$j]
done
|