博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Shell练习题(3)
阅读量:7144 次
发布时间:2019-06-29

本文共 3240 字,大约阅读时间需要 10 分钟。

(1)查找字母数小于6的单词

用shell打印下面这句话中字母数小于6的单词。

Bash also interprets a number of multi-character options.

1
2
3
4
5
6
7
8
#!/bin/bash
for 
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 
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 
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 
in 
`
seq 
0 14`; 
do
    
j=$[2**$i]
    
m=$[$m+$x]
    
echo 
$m
    
x=$[$x+$j]
done
本文转自Grodd51CTO博客,原文链接:http://blog.51cto.com/juispan/1951387
,如需转载请自行联系原作者
你可能感兴趣的文章
[ci]持续集成系列
查看>>
sparkr脚本
查看>>
VS Code 使用小技巧
查看>>
python 函数
查看>>
Quartz最佳实践
查看>>
Android ContentProvider、ContentResolver和ContentObserver的使用
查看>>
分割字符串
查看>>
cordova与ios native code交互的原理
查看>>
ios多线程操作(四)—— GCD核心概念
查看>>
springboot+swagger集成
查看>>
javaWeb中RSA的加密使用
查看>>
Web安全测试(一)-手工安全测试方法&修改建议
查看>>
WCF系列教程之WCF客户端异常处理
查看>>
.Net强类型视图
查看>>
struts2 easyui实现datagrid的crud
查看>>
Spring官方文档翻译——15.4 处理器映射(Handler mappings)
查看>>
VIM下的插入模式的相关知识:
查看>>
第二百八十节,MySQL数据库-外键链表之一对多,多对多
查看>>
python os.listdir
查看>>
开发,从需求出发 &#183; 之三 春天在哪里
查看>>