Shell脚本实战案例

一.企业Shell面试题1:批量生成随机字符文件名案例
使用for循环在/oldboy目录下批量创建10个html文件,其中每个文件需要包含10个随机小写字母加固定字符串oldboy,名称示例如下:

解答:

【文本如下】
[ -d /oldboy ] || mkdir /oldboy
cd /oldboy
echo $(pwd) && \

for i in {1..10}
do
filename=$(uuidgen|tr '0-9' 'a-z'|cut -c 1-10 )
touch ${filename}_oldboy.html
done

二.企业Shell面试题2:批量改名特殊案例
将以上面试题19.1.1中结果文件名中的oldboy字符串全部改成oldgirl(最好用for循环实现),并且将扩展名html全部改成大写。
解答:

【文本如下】
dir=/oldboy
cd $dir && \

for i in $(ls *html)
do
rn=$(echo $i|cut -c -10)
mv $i ${rn}_oldgir.HTML
done

三.企业Shell面试题3:批量创建特殊要求用户案例
批量创建10个系统帐号oldboy01-oldboy10并设置密码(密码为随机数,要求字符和数字等混合)。
解答:

【文本如下】
[ -d /oldboy ] || mkdir /oldboy
cd /oldboy
echo $(pwd) && \
source /etc/init.d/functions

for i in oldboy{01..10}
do
useradd $i &>/dev/null
if [ $? -eq 0 ]
then
action "$i" /bin/true
echo $(uuidgen|tr '0-9' 'a-z'|cut -c 1-10 )|passwd --stdin $i &>/dev/null
echo $i $(uuidgen|tr '0-9' 'a-z'|cut -c 1-10) >>/tmp/passwd.txt
else
action "$i" /bin/false
fi
done

四.企业Shell面试题4:扫描网络内存活主机案例
写一个Shell脚本,判断10.0.0.0/24网络里,当前在线的IP有哪些?
解答:

【文本如下】
for i in 10.0.0.{1..254}
do
ping -c 2 -w 2 $i &>/dev/null
if [ $? -eq 0 ]
then
echo $i is ok!
else
echo $i is down! >>/tmp/ip_down.txt
fi
done

五.企业Shell面试题5:解决DOS***生产案例
写一个Shell脚本解决DOS***生产案例。
请根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100(读者根据实际情况设定),即调用防火墙命令封掉对应的IP。防火墙命令为:iptables-I INPUT -s IP地址 -j DROP。
解答:

六.企业Shell面试题6:MySQL数据库分库备份
请实现对MySQL数据库进行分库备份,用脚本实现。
解答:

七.企业Shell面试题7:MySQL数据库分库分表备份
如何实现对MySQL数据库进行分库加分表备份,请用脚本实现。
解答:

【文本如下】
#!/bin/sh
Mycmd="mysql -uroot -pmysql"
Mydump="mysqldump $Mycmd --all-databases "
Dblist=$Mycmd -e "show databases;"|sed '1,2d'|egrep -v "_schema|mysql"
[ -d /tmp/mysql_bak/ ] || mkdir -p /tmp/mysql_bak/
for database in $Dblist
do
Tablist=$Mycmd -e "show tables from $database;"|sed 1d
for table in $Tablist
do
mkdir -p /tmp/mysql_bak/${database}
$Mydump $database $table|gzip >/tmp/mysqlbak/${database}/${table}$(date +%F).sql.gz
done
echo -e "\033[32m mysqldump ${database}is ok!!! \033[0m"
done

八.企业Shell面试题8:筛选符合长度的单词案例
利用bash for循环打印下面这句话中字母数不大于6的单词(某企业面试真题)。
I am oldboy teacher welcome to oldboy trainingclass
解答:
方式一:

方法二:数组
#!/bin/sh
word=(I am oldboy teacher welcome to oldboy training class)
for((i=0;i<${#word[*]};i++))
do
if [ echo ${word[i]}|wc -L -le 6 ]
then
echo ${word[i]}
fi
done

方法三:awk
echo "I am oldboy teacher welcome to oldboy training class"|awk '{for(i=1;i<=NF;i++)if(length($i)<=6)print $i}'

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

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

(2)Read交互式

(3)bash定义环境变量

十一.企业Shell面试题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、要对执行的脚本进行相关的条件判断,例如:脚本文件是否存在,是否可执行等判断,尽量用上前面讲解的知识点。

解答:

【文本如下】
lamp_start="/server/scripts/lamp.sh"
lnmp_start="/server/scripts/lnmp.sh"
read -p "please your caozuo number:" use

case $use in
1)
echo start installing lamp
[ -x /server/scripts/lamp.sh ] && $lamp_start
echo lamp is installed
;;
2)
echo start installing lnmp
[ -x /server/scripts/lnmp.sh ] && $lnmp_start
echo lnmp is installed
;;
3)
echo "install end! thanks!!!"
exit
;;
)
echo "use:1->lamp_start 2->lnmp_start
->input error"
exit
;;
esac

十二.企业Shell面试题12:Web及MySQL服务异常监测案例
用if条件语句实现对Nginx Web服务以及MySQL数据库服务是否正常进行检测,如果服务未启动,则启动相应服务。
解答:
【Nginx脚本】

【文本如下】
#!/bin/bash
server=$(ss -tunlp|grep nginx|wc -l)
if [ $server -gt 0 ]
then
echo "nginx is runnig!!!"
else
echo "nginx is no running!!!"
fi
echo $1
case $1 in
start)
/application/nginx-1.12.2/sbin/nginx
echo "nginx is running!!!"
;;
stop)
/application/nginx-1.12.2/sbin/nginx -s stop
echo "nginx is stop!!!"
;;
reload)
/application/nginx-1.12.2/sbin/nginx -s reload
;;
*)
echo "please use:start|stop|reload"
exit
;;
esac

【mysql脚本】

【文本如下】
#!/bin/bash
server=$(ss -tunlp|grep mysql|wc -l)
if [ $server -gt 0 ]
then
echo "mysql is runnig!!!"
else
echo "mysql is no running!!!"
fi
echo $1
case $1 in
start)
/etc/init.d/mysqld start
echo "mysql is running!!!"
;;
stop)
/etc/init.d/mysqld stop
echo "mysql is stop!!!"
;;
restart)
/etc/init.d/mysqld restart
;;
*)
echo "please use:start|stop|restart"
exit
;;
esac

十三.企业Shell面试题13:监控Memcached缓存服务是否正常
监控Memcached缓存服务是否正常,模拟用户(web客户端)检测。
使用nc命令加上set/get来模拟检测。
解答:

十四.企业Shell面试题14:开发脚本***检测与报警案例
面试及实战考试题:监控web站点目录(/var/html/www)下所有文件是否被恶意篡改(文件内容被改了),如果有就打印改动的文件名(发邮件),定时任务每3分钟执行一次。
解答:

【文本如下】
#!/bin/sh
html_dir=/var/html/www
html_file=find /var/html/www -type f
md5_dir=/tmp/checkdir
[ ! -d $md5_dir ] && mkdir $md5_dir
for i in $html_file
do
md5sum $i >>$md5_dir/o.txt
done
while true
do
md5sum -c $md5_dir/o.txt |grep -i failed>>$md5_dir/n.txt
[ -s $md5_dir/n.txt ] && \
echo "cat $md5_dir/n.txt"|mail -s "date:date +%F-%H:%M:%S Web is dangerous" [email protected]

$md5_dir/n.txt
sleep 3
done
十五.企业Shell面试题15:开发Rsync服务启动脚本案例
写网络服务独立进程模式下Rsync的系统启动脚本,例如:/etc/init.d/rsyncd {start|stop|restart}。
要求:
1.要使用系统函数库技巧。
2.要用函数,不能一坨SHI的方式。
3.可被chkconfig管理。
解答:
Centos6启动rsync脚本:

Centos7 启动rsync脚本:有点鸡肋!

十六.企业Shell面试题16:开发MySQL多实例启动脚本
开发MySQL多实例启动脚本:
已知MySQL多实例启动命令为:mysqld_safe --defaults-file=/data/3306/my.cnf&
停止命令为:mysqladmin -u root -poldboy123 -S/data/3306/mysql.sock shutdown
请完成mysql多实例启动启动脚本的编写
要求:用函数,case语句、if语句等实现。
解答:
【文本如下】
#!/bin/bash
. /etc/init.d/functions
Port="3306"
Myuser="root"
Mypass="mysql"
Mysock="/data/$Port/mysql.sock"
myport=ss -tunlp|grep '3306'|wc -l
if [ $myport -eq 1 ]
then
echo "mysql is runing!!!" >/dev/null
else
echo "mysql is no runing!!!"
/etc/init.d/mysqld start
echo "mysql is starting..."
fi
function_start(){
if [ -e "$Mysock" ]
then
action "mysqld_safe is running..." /bin/true
else
/application/mysql/bin/mysqld_safe --defaults-file=/data/$Port/my.cnf &>/dev/null &
action "mysqld_safe is starting..." /bin/true
fi
}
function_stop(){
if [ ! -e "$Mysock" ]
then
action "mysqld_safe is shutdown!" /bin/true
else
action "mysqld_safe is running!" /bin/true
/application/mysql/bin/mysqladmin -u$Myuser -p$Mypass -S $Mysock shutdown
action "mysqld_safe is stoping..." /bin/true
fi
}
function_restart(){
function_stop
sleep 3
function_start
action "mysqld_safe is restarting..." /bin/true
}
read -p "please enter you server:" server
case $server in
start)
function_start
;;
stop)
function_stop
;;
restart)
function_restart
;;
*)
echo "use:start|stop|restart"
esac

十七.企业Shell面试题17:天津项目学生实践抓阄案例
好消息,老男孩培训学生外出企业项目实践机会(第6次)来了(本月中旬),但是,名额有限,队员限3人(班长带队)。
因此需要挑选学生,因此需要一个抓阄的程序:
要求:
1、执行脚本后,想去的同学输入英文名字全拼,产生随机数01-99之间的数字,数字越大就去参加项目实践,前面已经抓到的数字,下次不能在出现相同数字。

2、第一个输入名字后,屏幕输出信息,并将名字和数字记录到文件里,程序不能退出继续等待别的学生输入。
解答:
【文本如下】
#!/bin/sh

/tmp/temp.txt
input(){
while true
do
read -p "pls input your name:" name
if [ -z $name ]
then
continue
elif [ $name == "0" ]
then
break
fi
rand=$((RANDOM%100))
echo -e $rand"\t"$name >>/tmp/temp.txt
done
}
output(){
cat /tmp/temp.txt |sort -n -k1 -r|sed '3a#################'
}
main(){
input
output
}
main

十八.企业Shell面试题18:破解RANDOM随机数案例
已知下面的字符串是通过RANDOM随机数变量md5sum后,再截取一部分连续字符串的结果,请破解这些字符串对应的使用md5sum处理前的RANDOM对应的数字?
21029299
00205d1c
a3da1677
1f6d12dd
890684b

解答:

【文本如下】
for i in {0..32767}
do
echo "$i:$(echo $i|md5sum)" >>/tmp/passbook.txt
done

查找密码:
egrep '21029299|00205d1c|a3da1677|1f6d12dd|890684b' /tmp/passbook.txt

说明:RANDOM最多随机生成32767个数

十九.企业Shell面试题19:批量检查多个网站地址是否正常
企业面试题:批量检查多个网站地址是否正常
要求:
1、使用shell数组方法实现,检测策略尽量模拟用户访问。
2、每10秒钟做一次所有的检测,无法访问的输出报警。
3、待检测的地址如下
http://blog.oldboyedu.com
http://blog.etiantian.org
http://oldboy.blog.51cto.com
http://10.0.0.7
解答:


【文本如下】
. /etc/init.d/functions
urllist=(
http://blog.oldboyedu.com
http://oldboy.blog.51cto.com
http://blog.etiantian.org
http://www.baidu.com
)
for i in ${urllist[@]}
do
port=curl -s -I -w "%{http_code}\n" $i -o /dev/null
if [ $port -eq 200 ];then
action "$i" /bin/true
else
action "$i" /bin/false
fi
done

20.企业Shell面试题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.
解答:
【文本如下】
#!/bin/sh
str="the squid project provides a number of resources toassist users design,implement and support squid installations. Please browsethe documentation and support sections for more infomation"

words(){
echo $str|sed 's#[^a-zA-Z]# #g'|tr " " "\n"|grep -v "^$"|sort|uniq -c|sort -r -n
}
letters(){
echo $str|grep -o "."|sort|egrep -v " |^$|[^a-zA-Z]"|uniq -c|sort -n -r
}
case $1 in
words)
words
;;
letters)
letters
;;
*)
echo "usage:$0 {words|letters}"
esac
21.企业Shell面试题21:开发脚本管理服务端LVS案例
请在LVS负载均衡主节点上,开发管理LVS服务的脚本ip_vs。
实现:利用ipvsadm可以启动并配置好LVS服务,脚本形式:/etc/init.d/lvs{start|stop|restart}
解答:

  1. 企业Shell面试题22:LVS节点健康检查及管理脚本案例
    请在LVS负载均衡主节点上,模拟keepalived健康检查功能管理LVS节点,当节点挂掉从服务器池中剔除,好了再加到服务器池中来。

解答:

  1. 企业Shell面试题23:LVS客户端配置脚本案例
    请在LVS客户端节点上,开发LVS客户端设置VIP以及抑制ARP的管理脚本
    实现:/etc/init.d/lvsclient{start|stop|restart}
    解答:

24.企业Shell面试题24:模拟keepalved软件高可用案例
请在LVS服务端备用节点上,模拟keepalved vrrp功能,监听主节点,如果主节点不可访问则备节点启动并配置LVS实现接管主节点的资源提供服务(提醒:注意ARP缓存),提示此题要借助19.1.21的功能。
解答:

25.企业Shell面试题25:编写正(或长)方形图形案例
请用shell或Python编写一个正(或长)方形,接收用户输入的数字。
解答:

【文本如下】
#!/bin/bash
read -p "Please Enter a number:" num

for ((i=1;$i<=$num;i++))
do
for ((j=1;j<=$((2*$num));j++))
do
echo -e "+\c" #不换行
done
echo
done

26.企业Shell面试题26:编写等腰三角形图形字符案例
请用shell或Python编写一个等腰三角形,接收用户输入的数字。
解答:

【文本如下】
#!/bin/bash
read -p "Please Enter a number:" num

for((i=1;$i<=$num;i++))
do
for((h=$((2$num-2$i));h>=0;h--))
do
echo -e " \c"
done
for((j=1;j<=$((2$i-1));j++))
do
echo -e "
\c" #不换行
done
echo
done

  1. 企业Shell面试题27:编写直角梯形图形字符案例
    请用shell或Python编写一个画直角梯形程序,接收用户输入的参数n(n>2),m。
    解答:


【文本如下】
#!/bin/bash
if [[ -n $1 ]] && [[ -n $2 ]];then
for ((i=$1;$i<=$2;i++))
do
for ((j=1;j<=$i;j++))
do
echo -e "*\c" #不换行
done
echo
done
else
echo "No given two int arguments, please use $0 5 6|6 8!"
fi
28.企业Shell面试题28:51CTO博文爬虫案例
老男孩教育培训机构需求:需求入下:
请把http://oldboy.blog.51cto.com地址中的所有博文,按照时间倒序列表如下:
2013-09-13运维就是一场没有硝烟的战争
http://oldboy.blog.51cto.com/2561410/1296694
2016-04-17运维人员写项目方案及推进项目的基本流程思路
http://oldboy.blog.51cto.com/2561410/1764820
附加:高级要求:
生成html页面,并设置超链接。
结果如下:
http://oldboy.blog.51cto.com/2561410/1862041
解答:


【文本如下】
#!/bin/sh
Uri="https://blog.51cto.com/oldboy/p"
Html_list=/tmp/html/oldboy_blog.html
[ ! -d /tmp/html ] && mkdir -p /tmp/html

for i in {1..29}
do
curl -s $Uri$i|grep -A 5 "time fl"|sed '/^.zan fr./,+2d'|sed 's#^--$#
#g'|sed 's#fl">发布于:##g'|sed 's#an>##g' >>$Html_list
echo '
' >>$Html_list
done

29.企业Shell面试题29:Nginx负载节点状态监测案例
开发通过Web界面展示监控Nginx代理节点状态,效果图如下,当节点宕机时,以红色展示,当节点正常时以绿色展示。
如图:

30.企业Shell面试题30:企业代码上线发布系统案例
写一套简单的企业代码上线发布系统案例,利用SVN对代码及配置文件进行管理,在办公室服务器上从svn取出指定版本的代码和配置,发布到IDC机房分发机服务器上,在分发服务器或者负载均衡器上或者应用服务器本地实现代码平滑发布、上线、回滚脚本(具体设计请参考课堂讲解的企业代码发布方案)。

解答:

31.在之前的30道shell编程题目中给每个伙伴随机抽取10道题目
解答:

转载于:https://blog.51cto.com/13520779/2093146

你可能感兴趣的:(Shell脚本实战案例)