本文共 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 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 |