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 status\G"|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}\n"|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}\n"|grep -E "200|301|302"|wc -l        

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

-s                                不输出内容

L                                  指定地址

-w "%{http_code}\n"    状态码

-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\r\n" |nc 127.0.0.1 11211 &>/dev/null
printf "set key 0 0 10 \r\noldboy1234\r\n"|nc 127.0.0.1 11211 &>/dev/null
CDM=$(printf "get key\r\n"|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\r\n" |nc 127.0.0.1 11211 &>/dev/null                                       删除缓存中的key及对应的值

printf "set key 0 0 10 \r\noldboy1234\r\n"|nc 127.0.0.1 11211 &>/dev/null     添加新值

printf "get key\r\n"|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 "[,. ]" "\n" <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      倒序

 

 

 

  

 

 

 

 

 

  

转载于:https://www.cnblogs.com/wangxin-log/p/7123138.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值