(1)查找字母数小于6的单词
用shell打印下面这句话中字母数小于6的单词。
Bash also interprets a number of multi-character options.
#!/bin/bash forsinBashalsointerpretsanumberofmulti-characteroptions do n=`echo$s|wc-c` if[$n-lt6] thenecho$s fi done
(2)输入数字执行对应命令
写一个脚本实现如下功能: 输入一个数字,然后运行对应的一个命令。显示命令如下:cmd meau* 1―date 2�Cls 3�Cwho 4�Cpwd 当输入1时,会运行date,输入2时运行ls,依此类推。
#!/bin/bash echo"*cmdmeau**1---date2--ls3--who4--pwd" read-p"pleaseinputanumber1-4:"n case$nin 1) date ;; 2) ls ;; 3) who ;; 4) pwd ;; *) echo"Pleaseinputanumber:1-4" ;; esac
(3)监控httpd进程
在服务器上,写一个监控脚本:
每隔10s去检测一次服务器上的httpd进程数,如果大于等于500的时候,就需要自动重启一下apache服务,并检测启动是否成功?
若没有正常启动还需再一次启动,最大不成功数超过5次则需要理解发邮件通知管理员,并且以后不需要再检测!
如果启动成功后,1分钟后再次检测httpd进程数,若正常则重复之前操作(每隔10s检测一次),若还是大于等于500,那放弃重启并需要发邮件给管理员,然后自动退出该脚本。假设其中发邮件脚本为之前咱们使用的 mail.py
#!/bin/bash check_service() { n=0 foriin`seq15` do /usr/local/apache2/bin/apachectlrestart2>/tmp/apache.err if[$?-ne0] then n=$[$n+1] else break fi done if[$n-eq5] then ##下面的mail.py参考https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D22Z/mail.py pythonmai.py"123@qq.com""httpdservicedown"`cat/tmp/apache.err` exit fi } while: do t_n=`ps-Chttpd--no-heading|wc-l` if[$t_n-ge500] then /usr/local/apache2/bin/apachectlrestart if[$?-ne0] then check_service fi sleep60 fi sleep10 done
(4)封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 logfile=/home/logs/access.log d1=`date-d"-1minute"+%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 foripin`awk'$1>100{print$2}'$ips`;do $ipt-IINPUT-ptcp--dport80-s$ip-jREJECT echo"`date+%F-%T`$ip">>/tmp/badip.txt done } unblock(){ foriin`$ipt-nvL--line-numbers|grep'0.0.0.0/0'|awk'$2<15{print$1}'|sort-nr`;do $ipt-DINPUT$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
#!/bin/bash x=21 m=10 echo$m foriin`seq014`;do j=$[2**$i] m=$[$m+$x] echo$m x=$[$x+$j] done