输入数字执行命令 输入1执行 date命令 输入2执行 ls命令

可以使用case判断

#!/bin/bash echo "cmd manu 1 date 2 ls 3 pwd" read -p"please input a number;" n if [ -z $n ] then echo "shuruyigeshuzi" exit fi n1=echo $n|sed 's/[0-9]//g' if [ -n $n1 ] then echo "shuruyigechushuzi" exit fi

case $n in 1) date ;; 2) ls ;; 3) pwd ;; *) echo "range 1-4" ;; esac

添加user_00-user_09,并设置随机密码,密码要求10位,并包含数字及大小写字母,注意要把每一个用户密码记录到一个日志文件中。

mkpasswd 在脚本中设置随机密码 可以使用echo|passwd 命令 seq实现数字递增 mkpasswd生成随机字符

#!/bin/bash for i in seq -w 00 09 do useradd user_$i p=mkpasswd -l 10 -s 0 echo user_$i $p >> /tmp/pass.tmp echo $p|passwd --stdin user_$i done #for i in seq -w 00 09;do userdel -r user_$i;done

服务器上,写一个监控脚本,要求如下:

每隔10s去检测一次服务器上的httpd进程数,如果大于等于500的时候,就需要自动重启一下apache服务,并检测启动是否成功。

若没有正常启动还需再一次启动,最大不成功数超过5次则需要立即发邮件通知管理员,并且以后不需要再检测!

如果启动成功后,1分钟后再次检测httpd进程数,若正常则重复之前操作(每隔10s检测一次),若还是大于等于500,那放弃重启并需要发邮件给管理员,然后自动退出该脚本。假设其中发邮件脚本为之前使用的mail.py

核心要点 pgrep -l httpd或者ps -C httpd --no-heading检查进程 for循环5次计数器

#!/bin/bash

jianchafuwu() { c=0 for i in seq 1 5 do /usr/local/apache2.4/apachectl -l restart 2 > /tmp/httpd.err if [ ! $? -eq 0 ] then c=$[$c+1] else break fi done if [ $c -eq 5 ] then python mail.py 123@qq.com "httpd进程数大于500重启失败" "head -1 /tmp/httpd.err" exit fi }

while : do n=ps -C httpd --no -heading|wc -l if [ $n -ge 500 ] then jianchafuwu sleep 60
n1=ps -C httpd --no -heading|wc -l if [ $n1 -ge 500 ] then python mail.py 123@qq.com "apache重启1分钟后进程数大于500" "请排查问题" exit fi fi sleep 10 done

需求: 根据web服务器上的访问日志,把一些请求量非常高的ip给拒绝掉!并且每隔半小时把不再发起请求或者请求量很小的ip给解封。 假设:

一分钟内请求量高于100次的IP视为不正常请求。

访问日志路径为/data/logs/access_log。

用第2例中的1.log作为演示日志

核心要点 统计ip访问次数,排序 如何标记每隔半小时 iptables计数器是一个重要的判断指标 函数(封IP、解封IP) 日志文件为1.log

#!/bin/bash block_ip() { t1=date -d "-1 min" +%Y:%H:%M log=/shell100/1.log egrep "$t1[0-9]+"$log >/tmp/tmp_last_min.log awk '{print $1}' 1.log|sort -n|uniq -c|sort -n|awk '$2>100 {print}' > /tmp/bad.ip_list n=wc -l /tmp/bad.ip_list|awk '{print $1}' if [ $n -ne 0 ] then for ip in cat /tmp/bad.ip_list do iptables -I INPUT -s $ip -j REJECE done fi }

unblock_ip () { iptables -nvL INPUT |sed '1d'|awk '$1<5 {print $8}'>/tmp/goog.ip_list n=wc -l /tmp/goog.ip_list|awk '{print $1}' if [ $n -ne 0 ] then for ip in cat /tmp/good_ip.list do iptabls -D INPUT -s $ip -j REJECT done fi iptables -Z }

t=date +%M if [ $t == "00" ]||[ $t == "30" ] then unblock_ip block_ip else block_ip fi #将脚本添加到计划任务 crontab

请仔细查看如下几个数字的规律,并使用shell脚本输出后面的十个数字。

10 31 53 77 105 141 …….

核心要点 计算两个数值之间的差值

#!/bin/bash x=10 y=21 for i in seq 0 15 do echo $x x=$[$x+$y] z=$[2**$i] #幂指数运算 y=$[$y+$z] done