一、写一个脚本,输入数字后执行对应命令: 1 date 2 ls 3 who 4 pwdpython
难点:在于用read -p 来采集用户的数据,而后用 case 循环来判断;linux
[root@localhost_002 shell100]# cat 9.sh #!/bin/bash echo "cmd meau** 1 - date 2 - ls 3 - who 4 - pwd" read -p "please input a number1-4: " n if [ -z "$n" ] then echo "The value empty" exit fi n1=`echo $n|sed 's#[0-9]##g'` if [ -n "$n1" ] then echo "you is not number;" exit fi case $n in 1) date ;; 2) ls ;; 3) who ;; 4) pwd ;; *) echo "you is not 1-4;" ;; esac [root@localhost_002 shell100]# sh 9.sh cmd meau** 1 - date 2 - ls 3 - who 4 - pwd please input a number1-4: 2 1 1.txt 3.sh 4.sh 5.sh 6.sh 7.sh 8_1.sh 8.sh 9.sh lanmp.sh nohup.out
二、在linux系统下生成user00_user_09这10个用户,并设置随机10位的密码,把用户名和密码定向到一个文件/tmp/pw.txt里;nginx
难点:生成密码时,须要使用密码生成工具 mkpasswd -l 10 -s 4 或者用系统自带变量 echo $RANDOM|md5sum|cut -c 1-10web
[root@localhost_002 shell]# echo $RANDOM|md5sum|cut -c 1-10 6fd424ad94 [root@localhost_002 shell]# mkpasswd -l 10 -s 4 z{!W96J'=e
mkpasswd -l 10 -s 4 ( -l 密码长度 -s 特殊字符 -d 数字) == echo $RANDOM|md5sum|cut -c 1-10 (RANDOM系统变量) $RANDOM|md5sumshell
seq -w 0 50 以最长的宽度为准;表示以最后一位值得宽度为准; seq 0 2 10 指定步长增值2; 会打印 0 2 4 6 8bash
[root@localhost_002 shell]# seq 0 2 10 0 2 4 6 8 10
seq -w 0 10 表示会以 10 为准, 打印 00 01 02 03 04 05 06 07 08 09 10 服务器
脚本内容以下: 须要用for 循环,而后打印pw的密码,而后用 echo "密码" |passwd -stdin user 来更新密码,最后写入到同一个文件/tmp/pw.txt函数
[root@localhost_002 shell100]# cat 10.sh #!/bin/bash for u in `seq -w 0 09` do pw=`mkpasswd -l 10 -s 4` # pw=`echo $RANDOM|md5sum|cut -c 1-10` useradd use_$u echo "$pw"|passwd --stdin use_$u >/dev/null 2>&1 echo "use_$u $pw" >> /tmp/pw.txt done [root@localhost_002 shell100]# cat /tmp/pw.txt use_00 MZ(~2eo,)5 use_01 6Q*9Z\}kg\ use_02 i9_U5kB:*& use_03 VN2~_'on|5 use_04 &Y%e7"F'l1 use_05 gG[#8pI3'^
二、删除用户:有以下两种方法:工具
经过在/etc/passwd来过滤出第一行的用户: cat /etc/passwd|grep 'use'|cut -d ':' -f 1 ;而后userdel 删除用户命令;spa
经过 for 循环来打印,而后执行 userdel 删除用户命令;
[root@localhost_002 shell100]# cat 10_1.sh #!/bin/bash for i in `cat /etc/passwd|grep 'use'|cut -d ':' -f 1` do userdel -r $i >/dev/null 2>&1 done
第二种方法:经过 for 循环来打印,而后执行 userdel 删除用户命令;
[root@localhost_002 shell100]# cat 10_3.sh #!/bin/bash for i in `seq -w 00 50` do userdel -r use_$i >/dev/null 2>&1 done
注释: seq 0 2 10 表示增值为2;打印 0 10;
[root@localhost_002 shell100]# seq 0 2 10 0 2 4 6 8 10
注释: echo "$pw"|passwd --stdin use_$u >/dev/null 2>&1 == echo -e "$pw\n$pw\n" |passwd use_$u
三、监控httpd的进程;每隔10s检测一次服务器的httpd的进程数,若是大于500则自动重启httpd服务;并检测是否启动成功;
若是没有正常启动还须要再启动一次,最大不成功数超过五次当即发邮件给管理员;而且不须要在检测;
若是启动成功后,1分钟后检测httpd的进程数,若正常则重启以前10s检测一次,若仍是大于500则发邮件给管理员,并自动退出此脚本;
注释: 统计进程个数的命令: ps -C nginx --no-heading|wc -l ==== pgrep -l nginx|wc -l
思路:每10秒检测一次,那只能用死循环 while;
检测是否启动成功的命令能够用 echo $? 来判断返回值;
若是启动不成功,启动五次能够用计数器来判断;超过5次则发邮件告警;
[root@localhost_002 shell100]# cat 11.sh #!/bin/bash check_service() { n=0 for i in `seq 1 5` do /etc/init.d/nginx restart 2>> /tmp/nginx.err if [ $? -ne 0 ] then n=$[$n+1] else break fi done if [ $n -eq 5 ] then python mail.py "yuanhh@163.com" "The is http down" exit fi } while : do n=`pgrep -l nginx|wc -l` if [ $n -ge 500 ] then /etc/init.d/nginx restart if [ $? -ne 0 ] then check_service fi sleep 60 t_n=`pgrep -l nginx|wc -l` if [ $_n -ge 500 ] then python mail.py "yuanhh@163.com" "http service is down" "the httpd is budy;" fi fi sleep 10 done
注释:check_server 为自定义的函数,用来统计nginx 启动不成功时的计数, n 是一个计数器,每次重启不成功都会加1,超过5次后则发邮件告警退出,若是重启成功了则break(跳出for循环)了:
四、根据web服务器的访问日记,把一些请求量比较高的IP给拒绝掉,而且每隔d把请求量小的IP解封;
假设:一分钟请求量高于100次的IP则不正常; 访问日记路径为/data/logs/access.log
首先须要打印出上一分钟的日记内容;t1=`date -d "-1 min" +%Y:%H:%M`
t1=`date -d "-1 min" +%Y:%H:%M`
egrep "$t1:[0-9]+" 1.log|awk '{print $1}' #过滤出来上一分钟的日记内容; 加 号 表示一次屡次;
[root@localhost_002 shell100]# cat 12.sh #!/bin/bash block_ip(){ t=`date -d "-l min" +%Y:%H:%M` logs=/usr/local/nginx/logs/access.log n=egrep "$t[0-9]+" 1.log > /tmp/tmp_min.log awk '{print $1}' /tmp/tmp_min.log|sort -n|uniq -c|sort -n|awk '$1>100 {print $2}' > /tmp/badip.list n-`wc -l /tmp/badip.list` if [ $n -ne 0 ] then for ip in `cat /tmp/badip.list` do iptables -I INPUT -s $ip -j REJECT done fi } unblock_ip() { iptables -nvL INPUT|sed '1,2d'|awk '$<5 print $8' > /tmp/goodip.list n=`wc -l /tmp/goodip.list|awk '{print $1}'` if [ $n -ne 0 ] then for i in `cat /tmp/goodip.list` do iptables -D INPUT -s $ip -j REJECT done fi iptables -Z } d=`date +%M` if [ $d == "00" ] || [$d == "30" ] then unblock_ip block_ip else block_ip fi
五、算数字:
请仔细阅读以下数字,并使用shell脚本输出后面的10个 数字;
10 31 53 77 105 141 .............
首先寻找规律; 寻找差值,假设第一行差值定义成 x 第二行差值定义成 y 第三行差值定义成 z;
10 31 53 77 105 141
21 22 24 28 36
1 2 4 8
首先计算第三行的差值 z; 分别是2 的 0 次方 1次方 2次方 3次方;
第一行的第一个数字是10,第二行的第一个数字是21,第三行数字就是2的幂次方;作一个for 循环;
每一次循环,第二行数字数字加上第三行的差值获得第二行的下个数字,第一行的数字须要加上第一行的下一个数字,获得第一行的下一个数字;
for i seq `0 4`;do z=$[2**$i]; echo $z;done
[root@localhost_002 shell100]# for i in `seq 0 3`;do z=$[2**$i];echo $z;done 1 2 4 8
而后计算第二行的差值 y ; 可知 y的初始值时21,每次在它基础上加上 2 的 n 次方;
y=21;for i in 'seq 0 4'; do echo $y; z=$[2**2]; y=$[$y+$z];done
[root@localhost_002 shell100]# y=21;for i in `seq 0 3`;do echo $y;z=$[2**$i];y=$[$y+$z];done 21 22 24 28
求x: 可知 x 的初始值是 10, 而后每次分别加上 y 的值, 求出下一个值;
x=10;y=21;for i in `seq 0 4`; do echo $x; x=$[$x+$y];z=[2**$i];y=$[$y+$z];done
[root@localhost_002 shell100]# x=10;y=21;for i in `seq 0 4`; do echo $x;x=$[$x+$y];z=$[2**$i];y=$[$y+$z];done 10 31 53 77 105
脚本格式以下:
[root@localhost_002 shell100]# cat 15.sh #!/bin/bash x=10 y=21 for i in `seq 0 10` do echo $x x=$[$x+$y] z=$[2**$i] y=$[$y+$z] done