• Shell必会30道题


    1、批量生成随机字符文件名

    使用for 循环在/oldboy目录下批量创建10个html文件,其中每个文件需要包含10个随机小写字母加固定字符串oldboy,名称示例如下:

    [root@shiyanji ~]# ls /oldboy/
    aebecfecbd_oldboy.html  baaaafbcda_oldboy.html  ccdeadaebe_oldboy.html  ceefcaaffc_oldboy.html  deacbedcdb_oldboy.html
    afcbdeeafc_oldboy.html  bbbceadeef_oldboy.html  cdedcfadec_oldboy.html  dcdbedaace_oldboy.html  ecfebeaaaf_oldboy.html

    解答:

    [root@shiyanji scripts]# vim ti1.sh 
    
    #!/bin/bash
    Path=/oldboy
    [ -d "$Path" ] || mkdir -p /oldboy
    for i in `seq 10`
    do
        name=$(echo $RANDOM|sha512sum|sed 's#[^a-z]##g'|cut -c 1-10)
        touch $Path/${name}_oldboy.html
    done 

    2、批量改名

    将上题中的oldboy字符串全部改成oldgirl(最好用for循环实现),并且将扩展名html全部改成大写。

    解答:

    [root@shiyanji scripts]# vim ti2.sh
    
    #!/bin/bash
    cd /oldboy    要先进入目录再ls,不然会报错   
    for i in `ls` do name=$(echo $i|awk -F "_" '{print $1}') mv $i ${name}_oldgirl.HTML done

     3、批量创建特殊要求用户

    批量创建10个系统账号oldboy01-oldboy10并设置密码(密码为随机数,要求是字符和数字等的混合)。

    不使用for循环做法

    seq -w 10|sed 's#.*#useradd oldboy&;a=`echo $RANDOM|sha512sum|cut -c 1-10`;echo $a|passwd --stdin oldboy&;echo oldboy& $a >>/tmp/mima#ge'

    说明:

    e     等于bash

    -w   平衡宽度用前导零填充

    使用for循环脚本

    [root@shiyanji scripts]# vim ti3.sh
    
    #!/bin/bash
    for user in oldboy{01..10}
    do
        mima=$(echo $RANDOM|sha512sum|cut -c 1-10)
        useradd ${user} && echo ${mima}|passwd --stdin ${user}
        echo ${user} ${mima} >>/tmp/new
    done

     4、扫描网络内存活主机

    写一个Shell脚本,判断10.0.0.0/24网络里,当前在线的IP有哪些?

    解答:

    #!/bin/bash
    for i in 10.0.0.{1..254}
    do
        {
            ping -w 2 -c 2 $i &> /dev/null
        if [ $? -eq 0 ];then
            echo "$i is ok"
        fi
        }&
    done

    说明:

    ping         -c   count次数           -w   延期时间

    . /etc/init.d/functions 调用这个库

    action $i /bin/true    固定格式(把$i以这个库的true格式显示)

    action $i /bin/false   固定格式(把$i以这个库的false格式显示)

    &       Shell的并发检测功能,批量ping,快速返回结果     

    5、解决DOS攻击

    写一个Shell脚本以解决DOS攻击生产的问题

    请根据Web日志或网络连接数,监控当某个IP并发连接数或短时内PV达到100(读者可根据实际情况来设定)时,即调用防火墙命令封掉对应的IP。防火墙命令为:"iptables -I INPUT -s IP -j DROP"(IP为要封的地址)。

    解答:

    [root@shiyanji scripts]# vim ti5.sh
    
    #!/bin/bash
    logfile=/tmp/access_2010-12-8.log
    PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
    export PATH
    touch /tmp/ip_drop.log
    while true
    do
        awk '{print $1}' $logfile|sort|uniq -c >/tmp/dos.log
        while read line
        do
            arr=($line)
            if [ ${arr[0]}  -gt 10 -a `grep ${arr[1]} /tmp/ip_drop.log|wc -L` -lt 1 ];then
                iptables -I INPUT -s ${arr[1]} -j DROP && 
                    echo ${arr[1]} >>/tmp/ip_drop.log
            fi
        done </tmp/dos.log
        sleep 3
    done   

    说明:

    PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
    export PATH           定义变量(后面就不用写全路径了)
    测试: iptables -nL 查看封的IP iptables -F 清空规则

    6、MySQL数据库分库备份

    请用脚本实现对MySQL数据库的分库备份。

    解答:

    [root@db01 scripts]# vim ti6.sh 
    
    #!/bin/bash
    user=root
    passwd=oldboy123
    login="mysql -u$user -p$passwd"
    dump="mysqldump -u$user -p$passwd"
    DATABASE=$($login -e "show databases;"|egrep -v "*schema|mysql|Database")
    mkdir -p /opt/backup
    for database in $DATABASE
    do
      $dump $database |gzip >/opt/backup/${database}_$(date +%F).sql.gz

    说明:

    mysqldump -uroot -poldboy123 |gzip >/opt/oldboy_$(date +%F).sql.gz                           全备份命令

    mysql -uroot -poldboy123 -e "show databases;"|egrep -v "*schema|mysql|Database"     排除没用库

     

    7、MySQL数据库分库分表备份

    请用脚本实现对MySQL数据库的分库加分表备份。

    解答:

    [root@db01 scripts]# vim ti7.sh
    
    #!/bin/bash
    user=root
    passwd=oldboy123
    login="mysql -u$user -p$passwd"
    dump="mysqldump -u$user -p$passwd"
    DATABASE=$($login -e "show databases;"|egrep -v "*schema|mysql|Database")
    mkdir -p /opt/backup
    for database in $DATABASE
    do
        TABLE=$($login -e "use oldboy;show tables;"|sed '1d')
      for table in $TABLE
    do
      [ -d /opt/backup/$database ] || mkdir -p /opt/backup/$database
        $dump $database $table |gzip >/opt/backup/$database/${database}_${table}_$(date +%F).sql.gz
      done
    done

    说明:

    mysql -uroot -poldboy123 -e "use oldboy;show tables;"                 命令行显示表

    mysql -uroot -poldboy123 -e "use oldboy;show tables;"|sed '1d'    排除第一行

       

    8、筛选符合长度的单词案例

    利用bash for循环打印下面这句话中字母数不大于6的单词(某企业面试真题)。

    I am oldboy teacher welcome to oldboy trainingclass

    解答:

    [root@shiyanji scripts]# vim ti8.sh
    
    #!/bin/bash
    for i in I am oldboy teacher welcome to oldboy trainingclass
    do
        if [ ${#i} -lt 6 ];then
            echo "$i"                                                                       
        fi
    done

    9、MySQL主从复制异常监控案例

    开发一个守护进程脚本每30秒监控MySQL主从复制是否异常(包括不同步以及延迟),如果异常,则发送短信并发送邮件给管理员存档。提示:如果没主从复制的环境,可以把下面文本放到文件里读取来模拟主从复制状态:

    解答:

    [root@db02 scripts]# vim ti9.sh
    
    . /etc/init.d/functions
    PATH="/application/mysql/bin/:$PATH"
    while true
    do
        wx=($(mysql -e "show slave statusG"|egrep "_Running: Yes|Behind_Master: 0"|wc -l))
        if [ $wx -eq 3 ]
        then
            action "mysql slave 一切正常" /bin/true
        else
            action "mysql slave 出现异常" /bin/false
        fi
        sleep 30
    done

    10、比较整数大小经典案例

    综合实战案例:开发shell脚本分别实现以脚本传参以及read读入的方式比较2个整数大小。用条件表达式(禁止if)进行判断并以屏幕输出的方式提醒用户比较结果。注意:一共是开发2个脚本。当用脚本传参以及read读入的方式需要对变量是否为数字、并且传参个数不对给予提示。

    解答:

    [root@shiyanji scripts]# vim ti10.sh 
    
    #!/bin/bash
    
    while true
    do
    read -p "请输入第一个数字:" a
    read -p "请输入第二个数字:" b
    
    [ -z "$a" ] || [ -z "$b" ] && {
        echo "输入有误,请输入一个数字"
        exit 2
    }
    expr $a + $b + 10 &>/dev/null
    PDZ=$?
         [ $PDZ -eq 0 ] || {
         echo "输入有误,请输入一个数字"                                                    
         exit 2
    }
    [ $a -lt $b ] && echo "$a < $b"
    [ $a -eq $b ] && echo "$a = $b"
    [ $a -gt $b ] && echo "$a > $b"
    done

    说明:

    -p    设置提示语句

    -z    判定字符串长度

    [ $PDZ -eq 0 ]  判定的是整数

    11、菜单自动化软件部署经典案例

    综合实例:打印选择菜单,按照选择一键安装不同的Web服务。

    示例菜单:

    [root@oldboy scripts]# shmenu.sh

        1.[install lamp]

        2.[install lnmp]

        3.[exit]

        pls input the num you want:

    要求:

    1、当用户输入1时,输出“startinstalling lamp.提示”然后执行/server/scripts/lamp.sh,脚本内容输出"lampis installed"后退出脚本,工作中就是正式lamp一键安装脚本;

    2、当用户输入2时,输出“startinstalling lnmp.提示” 然后执行/server/scripts/lnmp.sh输出"lnmpis installed"后退出脚本,工作中就是正式lnmp一键安装脚本;

    3、当输入3时,退出当前菜单及脚本;

    4、当输入任何其它字符,给出提示“Input error”后退出脚本;

    5、要对执行的脚本进行相关的条件判断,例如:脚本文件是否存在,是否可执行等判断,尽量用上前面讲解的知识点。

    解答:

    [root@shiyanji scripts]# vim ti11.sh 
    
    #!/bin/bash
    while true
    do
        clear
    cat <<EOF
        1.[install lamp]
        2.[install lnmp]
        3.[exit]
    EOF
    read -p "pls input the num you want:" a
    case "$a" in
        1) echo "startinstalling lamp"
           sleep 3
           ;;
        2) echo "startinstalling lnmp"
           sleep 3
           ;;
        3) echo "ByeBye"
           sleep 3
           exit 1                                                                           
           ;;
        *) echo "input error"
           sleep 3
           ;;
        esac
    done

    12、Web及MySQL服务异常监测案例

    用if条件语句实现对Nginx Web服务以及MySQL数据库服务是否正常进行检测,如果服务未启动,则启动相应服务。

    解答:

    使用wget或curl命令访问URL地址来测试:

    第一种:使用curl脚本:

    [root@web01 scripts]# vim ti12.sh
    
    CMD=$(curl -o /dev/null -sL 10.0.0.8 -w "%{http_code}
    "|grep -E "200|301|302"|wc -l)
    if [ $CMD -eq 1 ];then
        echo "Web服务运行正常"
    else
        echo "Web服务运行异常,没有启动Nginx,正在启动Nginx"
        /application/nginx/sbin/nginx
        sleep 2
    fi

    说明:

    通过curl命令进行测试,执行curl命令之后,查看个数,1为正常

    curl -o /dev/null -sL 10.0.0.8 -w "%{http_code} "|grep -E "200|301|302"|wc -l        

    -o /dev/null                 指定输出为空

    -s                                不输出内容

    L                                  指定地址

    -w "%{http_code} "    状态码

    -E                                 grep用到正则了加-E

    200、300、302           都表示正常(因为判断的服务运行)

    第二种:使用wget脚本

    [root@shiyanji scripts]# vim ti12.sh 
    
    #!/bin/bash
    wget -T 2 -t 2 --spider 10.0.0.8 &>/dev/null
    if [ $? -eq 0 ];then
        echo "Web服务一切正常"
    else
        echo "Web服务出现异常,没有启动Nginx,正在启动Nginx""
        /application/nginx/sbin/nginx
        sleep 2

    说明:

    通过$?返回值来判断Web服务,为0则正常

    wget -T 2 -t 2 --spider 10.0.0.8 &>/dev/null

    -T           超时时间(timeout)

    -t            重试次数(tries)

    --spider   模拟抓取

    还是查端口简单粗暴:

    [root@shiyanji scripts]# vim 12l.sh
    
    #!/bin/bash
    CMD=$(lsof -i:80|wc -l)
    if [ $CMD -ef 3 ]
        echo "Nginx运行正常"
    else
        echo "Nginx没有开启,正在开启Nginx"
        /application/nginx/sbin/nginx
        sleep 2                                                                                                                                                                   
    fi

    MySQL脚本:

    [root@db01 scripts]# vim ti12.sh
    
    CMD=$(ps -ef|grep mysql|wc -L)
    if [ $CMD -eq 287 ];then
        echo "MySQL一切正常"
    else
        echo "MySQL没有启动";/etc/init.d/mysqld start
    fi

    说明:

    通过开启MySQL和没开启时$?的返回值来判定是否开启MySQL

    13、监控Memcached缓存服务是否正常

    监控Memcached缓存服务是否正常,模拟用户(web客户端)检测。

    使用nc命令加上set/get来模拟检测。

    解答:

     环境准备:

    yum -y install libevent-devel        安装依赖关系
    yum -y install memcached             安装memcached
    memcached -m 16m -c 2048 -u root -p 11211 -d         启动memcached  

    脚本:

    [root@shiyanji scripts]# vim ti13.sh
    
    #!/bin/bash
    if [ `netstat -tunpl|grep 11211|wc -l` -lt 1 ];then
        echo "Memcache server is error."
        exit 1                                                                 
    fi
    printf "del key
    " |nc 127.0.0.1 11211 &>/dev/null
    printf "set key 0 0 10 
    oldboy1234
    "|nc 127.0.0.1 11211 &>/dev/null
    CDM=$(printf "get key
    "|nc 127.0.0.1 11211|grep oldboy1234|wc -l)
    if [ $CDM -eq 1 ]
    then
        echo "Memcached status is ok"
    else
        echo "Memcached status is bad"
    fi

    说明:

    printf "del key " |nc 127.0.0.1 11211 &>/dev/null                                       删除缓存中的key及对应的值

    printf "set key 0 0 10 oldboy1234 "|nc 127.0.0.1 11211 &>/dev/null     添加新值

    printf "get key "|nc 127.0.0.1 11211|grep oldboy1234|wc -l                       查看新值

    14、开发脚本入侵检测与报警案例

    面试及实战考试题:监控web站点目录(/var/html/www)下所有文件是否被恶意篡改(文件内容被改了),如果有就打印改动的文件名(发邮件),定时任务每3分钟执行一次。

    解答:

    [root@shiyanji scripts]# vim ti14.sh 
    
    #!/bin/bash
    #huanjingbushu
    mkdir -p /var/html/www
    cp -a /etc/a* /var/html/www/
    find /var/html/www -type f|xargs md5sum >/opt/md5sum.txt
    while true
    do
    md5sum=$(md5sum -c /opt/md5sum.txt |awk '{print $2}'|egrep "FAILED"|wc -l)
    ge=$(tree /var/html/www/|tail -1|awk '{print $1,$3}'|sed 's# ##g')
    if [ $md5sum -gt 0 ] ||  [ $ge -ne 1163 ]
    then
        echo "Web目录有变动"
        sleep 2                                                                                                                                                                   
    else
        :
    fi
    done

    说明:

    1、对站点/var/html/www/下的文件生成指纹然后比对指纹看是否有变化

    2、指纹比对对文件/目录的创建监控不了,所以用tree|wc -l查看个数对比进行监控

    相关命令

    find /var/html/www -type f|xargs md5sum >/opt/md5sum.txt    生成指纹

    md5sum -c /opt/error.txt                                                            指纹验证

    18、破解RANDOM随机案例

    已知下面的字符串是通过RANDOM随机数变量md5sum后,再截取一部分连续字符串的结果,请破解这些字符串对应的使用md5sum处理前的RANDOM对应的数字?

    21029299

    00205d1c

    a3da1677

    1f6d12dd

    890684b

    解答:

    [root@shiyanji scripts]# vim 18.sh
    
    #!/bin/bash
    array=(
    21029299
    00205d1c
    a3da1677
    1f6d12dd
    890684b
    )
    for i in {0..32767}
    do
        echo $i|md5sum >/tmp/md5sum.txt                                                      
        for n in ${array[*]}
        do
            grep $n /tmp/md5sum.txt
            if [ $? -eq 0 ]
            then
                echo "$i is $n"
            fi
        done
    done

    结果如下:

    [root@shiyanji scripts]# sh 18.sh 
    00205d1cbbeb97738ad5bbdde2a6793d  -
    1346 is 00205d1c
    1f6d12dd61b5c7523f038a7b966413d9  -
    7041 is 1f6d12dd
    890684ba3685395c782547daf296935f  -
    10082 is 890684b
    a3da1677501d9e4700ed867c5f33538a  -
    25345 is a3da1677
    2102929901ee1aa769d0f479d7d78b05  -
    25667 is 21029299

    说明:

    32767出处

    man bash然后输入/RANDOM

      

    19、批量检查多个网站地址是否正常

    企业面试题:批量检查多个网站地址是否正常

    要求:

    1、使用shell数组方法实现,检测策略尽量模拟用户访问。

    2、每10秒钟做一次所有的检测,无法访问的输出报警。

    3、待检测的地址如下

    http://blog.oldboyedu.com

    http://blog.etiantian.org

    http://oldboy.blog.51cto.com

    http://10.0.0.7

    解答:

    #!/bin/bash
    . /etc/init.d/functions
    url=(
    http://blog.oldboyedu.com
    http://blog.etiantian.org
    http://oldboy.blog.51cto.com
    http://10.0.0.7
    )
    while true
    do
        for i in ${url[*]}
        do
            wget -q -o /dev/null --spider -T 5 --tries=1 $i
        if [ $? -eq 0  ]
        then
            action "$i" /bin/true
        else
            action "$i" /bin/false
        fi
    done
        sleep 10
    done

    说明:

    wget -q -o /dev/null --spider -T 5 --tries=1 $i

    -q            不显示输出信息;

    -o            指定输出位置;

    --spider   模拟抓取;

    -T,           timeout 设置超时时间;

    –tries      增加重试次数;

     

    20、单词及字母去重排序案例

    用shell处理以下内容

    1、按单词出现频率降序排序!

    2、按字母出现频率降序排序!

    the squid project provides a number ofresources to assist users design,implement and support squid installations.Please browse the documentation and support sections for more infomation,byoldboy training.

    课堂实战考察某企业shell面试考试题

    http://oldboy.blog.51cto.com/2561410/1686891

    解答:

    1、按单词出现频率降序排序

    tr "[,. ]" "
    " <oldboy.txt |grep -v "^$"|sort|uniq -c|sort -rn

    2、按字母出现频率降序排序

    tr "[,.]" " " <oldboy.txt |sed 's# ##g'|grep -o "w"|sort|uniq -c|sort -rn

    说明:

    grep -o      精确匹配 

    w              匹配一个字母

    sort|uniq -c|sort -rn

    sort           纵队

    uniq-c       去重

    sort -rn      倒序

      

      

  • 相关阅读:
    apache多端口映射
    mark
    一些注册表值
    jsp URL中文处理的几种方式
    【引用】雨林木风Ghost XP SP3系统
    CentOS常用命令
    查看ie8临时文件夹
    卡塔兰数
    大数问题
    不会做的题目
  • 原文地址:https://www.cnblogs.com/wangxin-log/p/7123138.html
Copyright © 2020-2023  润新知