linux运维人员必会的30道shell编程面试题
一、序言
前几天一个做开发的朋友发给我一个链接,http://oldboy.blog.51cto.com/2561410/1632876?from=singlemessage&isappinstalled=0
是老男孩出的企业面试题培训叫做:合格linux运维人员必会的30道shell编程面试题及讲解,于是乎,,我打算每个都自己写一遍,,
PS:我是不是闲的蛋疼!!!
二、开撸
企业面试题1:(生产实战案例):监控MySQL主从同步是否异常,如果异常,则发送短信或者邮件给管理员。提示:如果没主从同步环境,可以用下面文本放到文件里读取来模拟:
阶段1:开发一个守护进程脚本每30秒实现检测一次。
阶段2:如果同步出现如下错误号(1158,1159,1008,1007,1062),则跳过错误。
阶段3:请使用数组技术实现上述脚本(获取主从判断及错误号部分)
企业面试题2:
使用for循环在/oldboy目录下通过随机小写10个字母加固定字符串oldboy批量创建10个html文件,名称例如为:
-
[root@oldboy oldboy]
# sh /server/scripts/oldboy.sh
-
[root@oldboy oldboy]
# ls
-
coaolvajcq_oldboy.html qnvuxvicni_oldboy.html vioesjmcbu_oldboy.html
-
gmkhrancxh_oldboy.html tmdjormaxr_oldboy.html wzewnojiwe_oldboy.html
-
jdxexendbe_oldboy.html ugaywanjlm_oldboy.html xzzruhdzda_oldboy.html
-
qcawgsrtkp_oldboy.html vfrphtqjpc_oldboy.html
############我的脚本2############################################
-
[root@cjy linux
-20]
# vim 2.sh
-
#!/bin/bash
-
-
WORK_DIR=/oldboy/
-
-
create(){
-
-
i=
1
-
while (($i<
11))
-
do
-
cd $WORK_DIR && touch `tr -dc
"a-z"</dev/urandom |head -c
10`_oldboy.html
-
i=$(($i+
1))
-
done
-
}
-
-
check(){
-
if [ -d $WORK_DIR ];
-
then
-
create
-
else
-
mkdir $WORK_DIR
-
create
-
fi
-
}
-
-
check
-
[root@cjy linux
-20]
# ./2.sh
-
-
[root@cjy linux
-20]
# ls /oldboy/
-
daijyyadst_oldboy.html mjmcfvvjcq_oldboy.html qmgbrihbco_oldboy.html yrxovjbwlv_oldboy.html
-
djfhdphvqf_oldboy.html mohijpfehs_oldboy.html xdtspqouln_oldboy.html
-
gjczumsnfy_oldboy.html nfwzssqtus_oldboy.html yhqruiiota_oldboy.htm
企业面试题3:请用至少两种方法实现!
将以上文件名中的oldboy全部改成oldgirl(用for循环实现),并且html改成大写。
############我的脚本3_1############################################
-
[root@cjy linux
-20]
# vim 3_1.sh
-
#!/bin/bash
-
-
change_name(){
-
DIR=/oldboy
-
FILE=`ls /oldboy`
-
GIRL=_oldgirl.HTML
-
-
for i
in $FILE
-
do
-
c=`echo $i | cut -c
1
-10`
-
mv $DIR/$c* $DIR/$c$GIRL
-
done
-
}
-
-
change_name
############我的脚本3_2############################################
-
[root@cjy linux
-20]
# vim 3_2.sh
-
#!/bin/bash
-
-
change_name(){
-
DIR=/oldboy
-
FILE=`ls /oldboy`
-
GIRL=_oldgirl.HTML
-
-
for i
in $FILE
-
do
-
c=`echo $i | awk -F
'_'
'{print $1}'`
-
mv $DIR/$c* $DIR/$c$GIRL
-
done
-
}
-
-
change_name
-
[root@cjy linux
-20]
# ./3_1.sh
-
[root@cjy linux
-20]
# ls /oldboy/
-
daijyyadst_oldgirl.HTML mjmcfvvjcq_oldgirl.HTML qmgbrihbco_oldgirl.HTML yrxovjbwlv_oldgirl.HTML
-
djfhdphvqf_oldgirl.HTML mohijpfehs_oldgirl.HTML xdtspqouln_oldgirl.HTML
-
gjczumsnfy_oldgirl.HTML nfwzssqtus_oldgirl.HTML yhqruiiota_oldgirl.HTML
企业面试题4:
批量创建10个系统帐号oldboy01-oldboy10并设置密码(密码为随机8位字符串)。
-
[root@cjy linux
-20]
# vim 4.sh
-
#!/bin/bash
-
-
USER=oldboy
-
create_user(){
-
-
for i
in {
01.
.10}
-
do
-
RPASSWD=$(tr -dc [:alpha:] < /dev/urandom |head -c
8)
-
useradd $USER$i
-
echo $RPASSWD|passwd $USER$i --stdin
-
echo $USER$i----$RPASSWD >> /oldboy/userpasswd.txt
-
done
-
}
-
-
del_user(){
-
-
for j
in {
01.
.10}
-
do
-
userdel $USER$j
-
rm -rf /home/$USER$j
-
done
-
}
-
-
case $
1
in
-
create)
-
create_user
-
;;
-
del)
-
del_user
-
;;
-
*)
-
echo
"Usage:Please use $0 create or $0 del."
-
echo
"####################################"
-
echo
"create: create user $USER 01-10 and give it random passwd."
-
echo
"del: delete $USER 01-10 and /home/$USER 01-10 directory. "
-
;;
-
esac
-
[root@cjy linux
-20]
# ./4.sh
-
Usage:Please use ./
4.sh create
or ./
4.sh
del.
-
####################################
-
create: create user oldboy
01
-10
and give it random passwd.
-
del: delete oldboy
01
-10
and /home/oldboy
01
-10 directory.
-
-
[root@cjy linux
-20]
# ./4.sh create
-
正在创建信箱文件: 文件已存在
-
更改用户 oldboy01 的密码 。
-
passwd: 所有的身份验证令牌已经成功更新。
-
正在创建信箱文件: 文件已存在
-
更改用户 oldboy02 的密码 。
-
passwd: 所有的身份验证令牌已经成功更新。
-
正在创建信箱文件: 文件已存在
-
更改用户 oldboy03 的密码 。
-
passwd: 所有的身份验证令牌已经成功更新。
-
正在创建信箱文件: 文件已存在
-
更改用户 oldboy04 的密码 。
-
passwd: 所有的身份验证令牌已经成功更新。
-
正在创建信箱文件: 文件已存在
-
更改用户 oldboy05 的密码 。
-
passwd: 所有的身份验证令牌已经成功更新。
-
正在创建信箱文件: 文件已存在
-
更改用户 oldboy06 的密码 。
-
passwd: 所有的身份验证令牌已经成功更新。
-
正在创建信箱文件: 文件已存在
-
更改用户 oldboy07 的密码 。
-
passwd: 所有的身份验证令牌已经成功更新。
-
正在创建信箱文件: 文件已存在
-
更改用户 oldboy08 的密码 。
-
passwd: 所有的身份验证令牌已经成功更新。
-
正在创建信箱文件: 文件已存在
-
更改用户 oldboy09 的密码 。
-
passwd: 所有的身份验证令牌已经成功更新。
-
正在创建信箱文件: 文件已存在
-
更改用户 oldboy10 的密码 。
-
passwd: 所有的身份验证令牌已经成功更新。
-
-
[root@cjy linux
-20]
# vim /etc/passwd
-
oldboy01:x:
503:
503::/home/oldboy01:/bin/bash
-
oldboy02:x:
504:
504::/home/oldboy02:/bin/bash
-
oldboy03:x:
505:
505::/home/oldboy03:/bin/bash
-
oldboy04:x:
506:
506::/home/oldboy04:/bin/bash
-
oldboy05:x:
507:
507::/home/oldboy05:/bin/bash
-
oldboy06:x:
508:
508::/home/oldboy06:/bin/bash
-
oldboy07:x:
509:
509::/home/oldboy07:/bin/bash
-
oldboy08:x:
510:
510::/home/oldboy08:/bin/bash
-
oldboy09:x:
511:
511::/home/oldboy09:/bin/bash
-
oldboy10:x:
512:
512::/home/oldboy10:/bin/bash
-
-
[root@cjy linux
-20]
# ./4.sh del #删除用户
企业面试题5:
写一个脚本,实现判断10.0.0.0/24网络里,当前在线用户的IP有哪些(方法有很多)
############我的脚本5############################################
-
[root@cjy linux
-20]
# vim 5.sh
-
#!/bin/bash
-
-
tmp_fifofile=/tmp/$$.fifo
-
mkfifo $tmp_fifofile
-
exec
6<> $tmp_fifofile
-
rm -rf $tmp_fifofile
-
-
thread=
254
-
for ((i=
0;i<$thread;i++))
-
do
-
echo >&
6
-
done
-
-
for ((i=
2;i<
255;i++))
-
do
-
read -u6
-
{
-
ip=
172.16
.27.
-
ping $ip$i -c
1 >/dev/null && echo $ip$i:live || echo $ip$i:dead >>
123
-
echo >&
6
-
}&
-
done
-
wait
-
exec
6>&-
-
-
exit
0
-
[root@cjy linux
-20]
# ./5.sh &
-
[
1]
22668
-
[root@cjy linux
-20]
# 172.16.27.11:live
-
172.16
.27
.23:live
-
172.16
.27
.25:live
-
172.16
.27
.27:live
-
172.16
.27
.28:live
-
172.16
.27
.24:live
-
172.16
.27
.26:live
-
172.16
.27
.21:live
-
172.16
.27
.31:live
-
172.16
.27
.30:live
-
172.16
.27
.37:live
-
172.16
.27
.54:live
-
172.16
.27
.61:live
-
172.16
.27
.80:live
-
172.16
.27
.254:live
企业实战题6:请用至少两种方法实现!
写一个脚本解决DOS攻击生产案例
提示:根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP,监控频率每隔3分钟。防火墙命令为:iptables -I INPUT -s 10.0.1.10 -j DROP。
企业实战题7:
开发mysql多实例启动脚本:
已知mysql多实例启动命令为:mysqld_safe--defaults-file=/data/3306/my.cnf &
停止命令为:mysqladmin -u root -poldboy123 -S /data/3306/mysql.sockshutdown
请完成mysql多实例启动启动脚本的编写
要求:用函数,case语句、if语句等实现。
企业实战题8:如何实现对MySQL数据库进行分库备份,请用脚本实现
企业实战题9:如何实现对MySQL数据库进行分库加分表备份,请用脚本实现
企业面试题10:请用至少两种方法实现!
bash for循环打印下面这句话中字母数不大于6的单词(昆仑万维面试题)。
I am oldboy teacher welcome to oldboy training class.
-
#!/bin/bash
-
-
-
echo
'###Usage1#####'
-
a=
'I am oldboy teacher welcome to oldboy training class.'
-
-
for i
in $a
-
do
-
NUM=`echo $i |wc -L`
-
if [ $NUM -le
6 ];then
-
echo $i
-
fi
-
done
-
-
-
echo
'###Usage2######'
-
-
for i
in $a
-
do
-
if [ ${
#i} -le 6 ];then
-
echo $i
-
fi
-
done
-
###Usage1#####
-
I
-
am
-
oldboy
-
to
-
oldboy
-
class.
-
###Usage2######
-
I
-
am
-
oldboy
-
to
-
oldboy
-
class.
-
企业面试题11:开发shell脚本分别实现以脚本传参以及read读入的方式比较2个整数大小。以屏幕输出的方式提醒用户比较结果。注意:一共是开发2个脚本。当用脚本传参以及read读入的方式需要对变量是否为数字、并且传参个数做判断。
企业面试题12:打印选择菜单,一键安装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,脚本内容输出"lampis installed"后退出脚本;
2、当用户输入2时,输出“startinstalling lnmp.”然后执行/server/scripts/lnmp.sh输出"lnmpis installed"后退出脚本;
3、当输入3时,退出当前菜单及脚本;
4、当输入任何其它字符,给出提示“Input error”后退出脚本。
5、要对执行的脚本进行相关条件判断,例如:脚本是否存在,是否可执行等。
-
#!/bin/bash
-
-
echo
"1.[install lamp]"
-
echo
"2.[install lnmp]"
-
echo
"3.[exit]"
-
-
read -t
30 -p
"Please input tut the num you want:" a
-
-
case $a
in
-
1)
-
if
-
[ -f lamp.sh ];then
-
./lamp.sh
-
sleep
3
-
echo
"lamp is installed!"
-
else
-
echo
"no lamp.sh!"
-
fi
-
;;
-
-
2)
-
if
-
[ -f lnmp.sh ];then
-
./lnmp.sh
-
sleep
3
-
echo
"lnmp is installed!"
-
else
-
echo
"no lnmp.sh!"
-
fi
-
;;
-
-
3)
-
exit
0
-
;;
-
-
*)
-
echo
"Input error"
-
exit
0
-
esac
-
[root@cjy linux
-20]
# ./12.sh
-
1.[install lamp]
-
2.[install lnmp]
-
3.[exit]
-
Please input tut the num you want:
1
-
no lamp.sh!
企业面试题13:
1、监控web服务是否正常,不低于3种监控策略。
2、监控db服务是否正常,不低于3种监控策略。
要求间隔1分钟,持续监控。
企业面试题14:监控memcache服务是否正常,模拟用户(web客户端)检测。
使用nc命令加上set/get来模拟检测,以及监控响应时间及命中率。
企业面试题15:面试及实战考试题:监控web站点目录(/var/html/www)下所有文件是否被恶意篡改(文件内容被改了),如果有就打印改动的文件名(发邮件),定时任务每3分钟执行一次(10分钟时间完成)。
企业面试题16:企业案例:写网络服务独立进程模式下rsync的系统启动脚本
例如:/etc/init.d/rsyncd{start|stop|restart} 。
要求:
1.要使用系统函数库技巧。
2.要用函数,不能一坨SHI的方式。
3.可被chkconfig管理。
企业面试题17:老男孩教育天津项目学生实践抓阄题目:
好消息,老男孩培训学生外出企业项目实践机会(第6次)来了(本月中旬),但是,名额有限,队员限3人(班长带队)。
因此需要挑选学生,因此需要一个抓阄的程序:
要求:
1、执行脚本后,想去的同学输入英文名字全拼,产生随机数01-99之间的数字,数字越大就去参加项目实践,前面已经抓到的数字,下次不能在出现相同数字。
2、第一个输入名字后,屏幕输出信息,并将名字和数字记录到文件里,程序不能退出继续等待别的学生输入。
企业面试题18:老男孩linux企业面试题:
已知下面的字符串是通过RANDOM随机数变量md5sum|cut-c 1-8截取后的结果,请破解这些字符串对应的md5sum前的RANDOM对应数字?
21029299
00205d1c
a3da1677
1f6d12dd
890684b
企业面试题19:批量检查多个网站地址是否正常
要求:shell数组方法实现,检测策略尽量模拟用户访问思路
http://www.etiantian.org
http://www.taobao.com
http://oldboy.blog.51cto.com
http://10.0.0.7
企业面试题20(中企动力)::用shell处理以下内容
1、按单词出现频率降序排序!
2、按字母出现频率降序排序!
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
-
[root@cjy linux
-20]
# cat test
-
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
-
[root@cjy linux
-20]
# cat 20_1.sh
-
#!/bin/bash
-
-
sed -i
's/\,\|\./ /g' test
-
-
for i
in `cat test`
-
do
-
echo $i
-
done
-
[root@cjy linux
-20]
# ./20_1.sh |sort|uniq -c |sort -r
-
2 support
-
2 squid
-
2
and
-
1 users
-
1 toassist
-
1 the
-
1 sections
-
1 resources
-
1 provides
-
1 project
-
1 Please
-
1 of
-
1 number
-
1 more
-
1 installations
-
1 infomation
-
1 implement
-
1
for
-
1 documentation
-
1 design
-
1 browsethe
-
1 a
-
[root@cjy linux
-20]
# cat 20_2.sh
-
#!/bin/bash
-
-
sed -i
's/\,\|\./ /g' test
-
-
for i
in `cat test`
-
do
-
for j
in `echo $i`
-
do
-
echo $j | awk -F
''
'{for(i=1;i<=NF;i++)print $i}'
-
done
-
done
-
[root@cjy linux
-20]
# ./20_2.sh |sort |uniq -c|sort -nr
-
19 s
-
17 e
-
16 o
-
14 t
-
12 n
-
12 i
-
11 r
-
9 a
-
8 u
-
7 p
-
7 d
-
6 m
-
4 l
-
4 c
-
3 f
-
2 q
-
2 h
-
2 b
-
1 w
-
1 v
-
1 P
-
1 j
-
1 g
企业面试题21:输出正方形、等腰三角形、直角梯形,见如下内容
http://oldboy.blog.51cto.com/2561410/1718607
企业面试题22:开发通过web界面展示监控Nginx代理节点状态,效果图如下。
![aa.jpg wKioL1Z2j3nCbtimAADO--T7ahw342.jpg](https://i-blog.csdnimg.cn/blog_migrate/cb1fb5f0784b962d73c887e49378a59c.jpeg)
lvs+keepalived集群部分Shell企业案例:
企业面试题23、【LVS主节点】手工开发ipvsadm管理lvs的脚本ip_vs
实现:/etc/init.d/lvs {start|stop|restart}
企业面试题24、【LVS主节点】模拟keepalived健康检查功能管理LVS节点,
当节点挂掉(检测2次,间隔2秒)从服务器池中剔除,好了(检测2次,间隔2秒)加进来
提示:利用ipvsadm命令实现添加和减少LVS节点。
企业面试题25、【LVS客户端节点】开发LVS客户端设置VIP以及抑制ARP的管理脚本
实现:/etc/init.d/lvsclient {start|stop|restart}
企业面试题26、【LVS备节点】模拟keepalved vrrp功能,监听主节点,如果主节点不可访问则备节点启动并配置LVS实现接管主节点的资源提供服务(提醒:注意ARP缓存)
企业面试题27、请用shell或Python编写一个正方形(oldboy_square.sh),接收用户输入的数字。
例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
[root@oldboy ~]
# sh oldboy_square1.sh
Please Enter a number:5
++++++++++
++++++++++
++++++++++
++++++++++
++++++++++
[root@oldboy ~]
# sh oldboy_square2.sh
Please Enter a number:9
■■■■■■■■■
■■■■■■■■■
■■■■■■■■■
■■■■■■■■■
■■■■■■■■■
■■■■■■■■■
■■■■■■■■■
■■■■■■■■■
■■■■■■■■■
|
-
[root@cjy linux
-20]
# vim 27_1.sh
-
-
#!/bin/bash
-
-
read -p
"Please Enter a number:" a
-
-
-
for ((i=
1;$i<=$a;i++))
-
do
-
for ((j=
1;j<=$((
2*$a));j++))
-
do
-
echo -e
"+\c"
#不换行
-
done
-
echo
-
done
-
[root@cjy linux
-20]
# ./27_1.sh
-
Please Enter a number:
5
-
++++++++++
-
++++++++++
-
++++++++++
-
++++++++++
-
++++++++++
-
[root@cjy linux
-20]
# cat 27_2.sh
-
#!/bin/bash
-
-
read -p
"Please Enter a number:" a
-
-
-
for ((i=
1;$i<=$a;i++))
-
do
-
for ((j=
1;j<=$a;j++))
-
do
-
echo -e
"■ \c"
#不换行
-
done
-
echo
-
done
-
[root@cjy linux
-20]
# ./27_2.sh
-
Please Enter a number:
9
-
■ ■ ■ ■ ■ ■ ■ ■ ■
-
■ ■ ■ ■ ■ ■ ■ ■ ■
-
■ ■ ■ ■ ■ ■ ■ ■ ■
-
■ ■ ■ ■ ■ ■ ■ ■ ■
-
■ ■ ■ ■ ■ ■ ■ ■ ■
-
■ ■ ■ ■ ■ ■ ■ ■ ■
-
■ ■ ■ ■ ■ ■ ■ ■ ■
-
■ ■ ■ ■ ■ ■ ■ ■ ■
-
■ ■ ■ ■ ■ ■ ■ ■ ■
企业面试题28、请用shell或Python编写一个等腰三角形(oldboy2_triangle.sh),接收用户输入的数字。
例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
[root@oldboy ~]
# sh oldboy2_triangle.sh
Please Enter a number:5
*
***
*****
*******
*********
[root@oldboy ~]
# sh oldboy2_triangle.sh
Please Enter a number:8
*
***
*****
*******
*********
***********
*************
***************
|
-
[root@cjy linux
-20]
# cat 28_1.sh
-
#!/bin/bash
-
-
read -p
"Please Enter a number:" a
-
-
-
for ((i=
1;$i<=$a;i++))
-
do
-
for ((h=$((
2*$a
-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
-
[root@cjy linux
-20]
# ./28_1.sh
-
Please Enter a number:
5
-
*
-
***
-
*****
-
*******
-
*********
-
[root@cjy linux
-20]
# ./28_1.sh
-
Please Enter a number:
8
-
*
-
***
-
*****
-
*******
-
*********
-
***********
-
*************
-
***************
企业面试题29、请用shell或Python编写一个画直角梯形程序(oldboy4.sh),接收用户输入的参数n,m
例如:
1
2
3
4
|
[root@oldboy ~]
# sh oldboy4.sh 4 6
****
*****
******
|
27,28,29三道题参考http://oldboy.blog.51cto.com/2561410/1718607
-
[root@cjy linux
-20]
# cat 29.sh
-
#!/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,such as $0 5 6!"
-
fi
-
[root@cjy linux
-20]
# ./29.sh 4 6
-
****
-
*****
-
******
企业面试题30:写一套简单的企业代码上线发布系统案例,利用SVN对代码及配置文件进行管理,在办公室服务器上从svn取出指定版本的代码和配置,发布到IDC机房分发机服务器上,在分发服务器或者负载均衡器上或者应用服务器本地实现代码平滑发布、上线、回滚脚本(具体设计请参考课堂讲解的企业代码发布方案)。