【运维心得】你不知道,运维也要写代码(3)

文章目录

  • 批量设置密码
  • 当前在线用户
  • 解决DOS攻击
  • 打印字母
  • 打印菜单
  • rsync系统启动脚本
  • 抓阄脚本
  • 检测网址
  • 解密脚本

今天继续上一篇的内容,研究几段常用的运维代码。

批量设置密码

写一个脚本,批量创建10个系统帐号oldboy01-oldboy10并设置密码(密码为随机8位字符串)。
参考答案:网上找到的其中一段代码如下(已验证通过):

#!/bin/bash
for i in `seq 01 10`
do
   useradd oldboy$i
   password=`tr -cd 'a-zA-Z0-9'  </dev/urandom  |head -c8`
   echo "$password |passwd --stdin oldboy$i" 
done 

当前在线用户

写一个脚本,实现判断10.0.0.0/24网络里,当前在线用户的IP有哪些(方法有很多)
参考答案:的确有很多方法,这里写一个最简单的(已验证通过),大家好记忆:

nmap -sP 192.168.1.0/24

解决DOS攻击

写一个脚本,解决DOS攻击生产案例
提示:根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP,监控频率每隔3分钟。防火墙命令为:iptables -A INPUT -s 10.0.1.10 -j DROP。(请用至少两种方法实现!)
参考答案:
第一种方法(未经验证):

#!/bin/bash
#tt=awk '{a[$1$4]++ }END{for (i in a) print i,a[i]}' localhost_access_log.2017-11-24.txt|sort -nk2|tail -10
#获取同一时间段和同一IP共同作为下标的数组,数组下标具有唯一性
#获取后按照第二列IP进行排序,取最大10条.
#第二个awk获取IP,准备下一步防火墙封IP
#tt2=$(awk '{a[$1$4]++ }END{for (i in a) print i,a[i]}' localhost_access_log.2017-11-24.txt|sort -nk2|tail -10|awk  -F'[' '{print $1}'|sort|uniq)
#
#awk '{a[$1$4]++ }END{for (i in a) print i,a[i]}' localhost_access_log.2017-11-24.txt|sort -nk2|tail -10|awk  -F'[' '{print $1,$2}'|awk '$3>3{print $1}'|sort|uniq -c
#
for i in $(awk '{a[$1$4]++ }END{for (i in a) print i,a[i]}' localhost_access_log.2017-11-24.txt|sort -nk2|tail -10|awk  -F'[' '{print $1,$2}'|awk '$3>3{print $1}'|sort|uniq)
do
	echo  $i
	echo "iptables-I INPUT -s $i -j DROP"
done

第二种方法(未经验证):

#!/bin/bash
while true
do
  awk '{print $1}' access.log|grep -v "^$"|sort|uniq -c > /tmp/tmp.log
  exec </tmp/tmp.log
  while read line
  do
    ip=`echo $link|awk'{print $2}'`
    count=`echo $line|awk '{print $1}'`
      if [ $count -gt 3 ] && [ `iptables -L -n|grep "$ip"|wc -l` -lt 1 ]
      then
        iptables -I INPUT -s $ip -j DROP
        echo "$line is dropped" >>/tmp/droplist.log
      fi
  done
  sleep 5
done

打印字母

bash for循环打印下面这句话中字母数不大于6的单词。(请用至少两种方法实现!)
I am oldboy teacher welcome to oldboy trainingclass.
参考答案:
代码一(已验证):

#!/bin/sh
string="I am oldboy teacher welcome to oldboy trainingclass"
number="`echo $string|grep -o " "|wc -l`"
number=`expr $number + 1`
for n in `seq $number`
do
   char=`echo $string|awk -F " " '{print$'"$n"'}'`
   num=`echo $char|wc -L`
   if [ $num -le 6 ]
      then echo $char
   fi
done

代码二(已验证):

#!/bin/sh
for n in I am oldboy teacher welcome to oldboy trainingclass
do
   if [ ${#n} -le 6 ];then
   echo $n
   fi
done

打印菜单

打印选择菜单,一键安装Web服务:
[root@oldboyscripts]# sh menu.sh
1.[install lamp]
2.[install lnmp]
3.[exit]
pls input the num you want:
要求:
1、当用户输入1时,输出“startinstalling lamp.”然后执行/server/scripts/lamp.sh,脚本内容输出"lamp is installed"后退出脚本;
2、当用户输入2时,输出“startinstalling lnmp.” 然后执行/server/scripts/lnmp.sh输出"lnmp is installed"后退出脚本;
3、当输入3时,退出当前菜单及脚本;
4、当输入任何其它字符,给出提示“Input error”后退出脚本。
5、要对执行的脚本进行相关条件判断,例如:脚本是否存在,是否可执行等。
参考答案(已验证,不完全一样,道理一致):

#!/bin/bash
RED_COLOR='\E[1;31m'
GREEN_COLOR='\E[1;32m'
YELLOW_COLOR='\E[1;33m'
BLUE_COLOR='\E[1;34m'
PINK_COLOR='\E[1;35m'
RES='\E[0m'
cat <<EOF   #要打印的菜单
1.[install lamp]
2.[install lnmp]
3.[install mysql]
4.[install php]
5.[exit]
EOF
read -p"pls input the num you want:" a   #请输入一个参数
case $a in
1)
  echo -e "$BLUE_COLOR startinstalling lamp $RES"    #给输出的内容加上颜色
  lampScripts=/server/scripts/lamp.sh
 [-f$lampScripts] && sh $lampScripts|| exit1   #判断要执行的lamp文件是否存在
 ;;
 2)
  echo -e "$PINK_COLOR startinstalling lnmp $RES"
  lnmpScripts=/server/scripts/lnmp.sh
  [-f$lnmpScripts] && sh $lnmpScripts|| exit2
 ;;
 3)
  echo -e "$GREEN_COLOR startinstalling mysql $RES"
  mysqlScripts=/server/scripts/mysql.sh
  [-f$mysqlScripts] && sh $mysqlScripts|| exit3
 ;;
 4)
 echo-e "$PINK_COLOR startinstalling php $RES"
 phpScripts=/server/scripts/mysql.sh
  [-f$phpScripts] && sh $phpScripts|| exit4
  ;;
 *)
  echo -e "$RED_COLOR input error $RES"
esac

rsync系统启动脚本

写一个网络服务独立进程模式下rsync的系统启动脚本
例如:/etc/init.d/rsyncd {start|stop|restart} 。
要求:
1.要使用系统函数库技巧。
2.要用函数,不能一坨SHI的方式。
3.可被chkconfig管理。
网上参考答案(已验证):
下面的代码执行之前,首先要把rsync的配置文件修改一下:

vi /etc/rsyncd.conf

把这句的注释去掉pid file=/var/run/rsyncd.pid
否则后面执行sh rsyncd.sh stop的时候,并不会停止服务。
验证的时候要会使用ps -ef|grep rsyncss -lntup|grep rsync,查看服务是否被启动和停止。

#!/bin/bash
# chkconfig: 2345 99 98
#author:oldyang
choice=$1
STOP=/var/run/rsyncd.pid
start(){
    [ -f $STOP ] || rsync --daemon
}
stop(){
    [ -f $STOP ] && kill `cat /var/run/rsyncd.pid`
}
restart(){
    [ -f $STOP ] && kill `cat /var/run/rsyncd.pid`
}
case "$choice" in
        start)
        start
        ;;
        stop)
        stop
        ;;
        restart)
        restart
    sleep 1
    rsync --daemon
        ;;
        *)
        echo "Usage: input right CMD. EX: {start|restart|stop}"
        exit 1
esac

抓阄脚本

运维派提供外出企业项目实践机会(第6次)来了(本月中旬),但是,名额有限,队员限3人(班长带队)。需要一个抓阄的程序挑选学生:
要求:
1、执行脚本后,想去的同学输入英文名字全拼,产生随机数01-99之间的数字,数字越大就去参加项目实践,前面已经抓到的数字,下次不能在出现相同数字。
2、第一个输入名字后,屏幕输出信息,并将名字和数字记录到文件里,程序不能退出继续等待别的学生输入。
网上参考答案(已验证):

#!/bin/bash
##############################################################
# File Name: zhuajiu.sh
# Version: V1.0
# Author: oldboy
# Organization: www.oldboyedu.com
##############################################################
>/tmp/name.log
random(){
    random="$((RANDOM%100))"
    if [ `egrep -w "$random" /tmp/name.log|wc -l` -ge 1 ]
    then
        continue
    fi
}
name(){
    read -p "请输入你的名字的全拼:" name
    if [ "$name" = "exit" ];
    then
        break
    fi
    if [ `egrep -w "$name" /tmp/name.log|wc -l` -ge 1 ]
    then
        echo "名字重复,请重新输入"
        continue
    fi
    echo -e "$random\t\t$name"|tee -a /tmp/name.log
}
main(){
    while true
    do
        random
        name
    done
    echo "抓阄结束,排序结果如下:"
    sort -rn -k1 /tmp/name.log|head -3
}
main

很有意思的一段代码,碰到抓阄的事情,就可以用上了

检测网址

批量检查多个网站地址是否正常
要求:shell数组方法实现,检测策略尽量模拟用户访问思路
http://www.yunweipai.com
http://www.taobao.com
http://www.chengxuyuan.com
http://10.0.0.7
网上参考答案(已验证):

#!/bin/bash
##############################################################
# File Name: check_url.sh
# Version: V1.0
# Author: gaobo
# Organization: [email protected]
# Created Time : 2017-12-05 19:07:45
# Description:
##############################################################
#!/bin/bash
web_array=(
http://blog.oldboyedu.com
http://blog.etiantian.org
http://oldboy.blog.51cto.com
http://10.0.0.7
)
while true
do
for ((i=0;i<${#web_array[*]};i++))
	do
		wget -T 10 --tries=2 --spider ${web_array[$i]} >/dev/null 2>&1
	if [ $? -eq 0 ]
	then
    	echo "${web_array[$i]} is ok" 
	else
    	echo "${web_array[$i]} is bad"
	fi
	sleep 3
	done
done

解密脚本

已知下面的字符串是通过RANDOM随机数变量md5sum|cut -c 1-8截取后的结果,请破解这些字符串对应的md5sum前的RANDOM对应数字?
21029299
00205d1c
a3da1677
1f6d12dd
890684b
网上参考答案(已验证):
此题首先要创建一个文本文件,把上面的处理后的数字放进去,比如aa.txt,然后就可以使用下面的代码了:

#!/bin/bash
##############################################################
# File Name: rd_mat.sh
# Version: V1.0
# Author: gaobo
# Organization: [email protected]
# Created Time : 2017-12-07 19:57:59
# Description:
##############################################################
for ((i=0;i<=32767;i++))
do
     for j in `cat /server/scripts/aa.txt`
     do
           #echo "$(echo $i|md5sum|cut -c 1-8)    ${j}"
        if [ "$(echo $i|md5sum|cut -c 1-8)" == "${j}" ]
        then
          echo  $i
       	fi
     done
done

代码很简单易懂,不过缺点是效率比较低,解密一个,基本需要半分钟左右,答案也公布一下:
1346
7041
25345
25667
可见,加密很快,但是解密非常费时间,为解密的科学家们点赞!大家如果有效率更高的算法,可以留言,谢谢!

你可能感兴趣的:(运维,运维,面试,代码)