企业面试题1:
监控MySQL主从同步是否异常,如果异常,则发送短信或者邮件给管理员;
提示:如果没主从同步环境,可以将文本放到文件里读取来模拟:
阶段1:开发一个守护进程脚本每30秒实现检测一次;
阶段2:如果同步出现如下错误号(1158,1159,1008,1007,1062),则跳过错误;
阶段3:请使用数组技术实现上述脚本(获取主从判断及错误号部分).
#!/bin/bash BAKPATH=/server/backup MYUSER=root MYPASS=oldboy123456 SOCKET=/usr/local/mysql/var/3307/mysql.sock MYCMD="mysql -u$MYUSER -p$MYPASS -S SOCKET" errno=(1158 1159 1008 1007 1062) status=(`$MYCMD -e "show slave status\G"|egrep "Running|Seconds_Behind|Last_SQL_Errno"|awk '{print $NF}'`) check_status(){ if [ "$status[0]" = "Yes" -a "$status[1]" = "Yes" -a "$status[2]" = "0" ];then echo "MySQL slave is ok" sta=0 else sta=1 return $sta fi } check_error(){ check_status if [ $? -eq 1 ];then for ((i=0;i<${#errno[*];i++})) do if [ "${errno[i]}" = "{status[3]}" ];then $MYCMD -e "stop slave;" $MYCMD -e "set global sql_slave_skip_counter = 1" $MYCMD -e "start slave;" fi done fi } check_again(){ status=(`$MYCMD -e "show slave status\G"|egrep "Running|Seconds_Behind|Last_SQL_Errno"|awk '{print $NF}'`) check_status &>/dev/null if [ $? -eq 1 ];then mail_content="mysql slave has something wrong `date +%F\ %T`" echo $mail_content>/tmp/slave_error.log mail -s $mail_content [email protected] fi } main(){ while true do check_error check_again sleep 60 done } 逻辑说明:如果错误码在给出的数组中,则跳过该错误,再次检查时,如果仍然报错,则发邮件告警; 如果错误码不在给出的数组,check_error函数虽然什么都没做,错误仍然存在,但check_again会直接告警.
企业面试题2:
使用for循环在/oldboy目录下通过随机小写10个字母加固定字符串oldboy批量创建10个html文件
cat /server/scripts/test2.sh #!/bin/bash tar_dir=/oldboy [ ! -d $tar_dir ] && mkdir $tar_dir cd $tar_dir for((i=1;i<11;i++)) do touch `echo $RANDOM |md5sum |cut -c 1-10`_oldboy.html done 081aa8a295_oldboy.html 28826c916d_oldboy.html 610005ed9a_oldboy.html 1fced986e9_oldboy.html 28c3541f1a_oldboy.html 6847874d50_oldboy.html 26f612105c_oldboy.html 3bbc4c31b6_oldboy.html a101e4c7f1_oldboy.html
企业面试题3:请用至少两种方法实现!
将以上文件名中的oldboy全部改成oldgirl(用for循环实现),并且html改成大写.
方法一: #!/bin/bash cd /oldboy for i in `ls` do mv $i `echo $i | sed 's#oldboy.html#oldgirl.HTML#g'` done 方法二: #!/bin/bash cd /oldboy for i in `ls` do echo $i | awk -F '[_]' '{print "mv " $0,$1"_oldgirl.HTML"}'|bash done 方法三: rename "oldboy.html" "oldgirl.HTML" $i 方法四:sed后向引用 mv $i `echo $i | sed -r 's#(^.*)oldboy.html#\1oldgirl.HTML#g'` mv $i `echo $i | sed -r 's#(^.*)_(.*).html#\1_oldgirl.HTML#g'
企业面试题4:
批量创建10个系统帐号oldboy01-oldboy10并设置密码(密码为随机8位字符串)
# 获取随机字符串的几种方法: echo $RANDOM |md5sum |cut -c 1-8 openssl rand -base64 32|sed 's#[^a-z]##g' cat /proc/sys/kernel/random/uuid #!/bin/bash . /etc/init.d/functions [ $UID -ne 0 ]&&{ echo "Pls sudo su - root" exit 1 } for n in `seq -w 10` # for user in stu`echo {01..10}` do pass="`echo $RANDOM|md5sum|cut -c 2-9`" useradd oldboy$n &>/dev/null &&\ echo $pass|passwd --stdin oldboy$n &>/dev/null # echo "$user:$pass"|tee >>/oldboy/userlist.log if [ $? -eq 0 ];then action "add oldboy$n" /bin/true else action "add oldboy$n" /bin/false fi echo -e "oldboy$n\t$pass" >>/oldboy/userpasswd.txt done # chpasswd < /oldboy/userlist.log
企业面试题5:
写一个脚本,判断192.168.165.0/24网络里,当前在线用户的IP有哪些
#!/bin/bash . /etc/init.d/functions cmd="ping -W 2 -c 2" ip="192.168.165." for n in `seq 254` do { $cmd $ip$n &>/dev/null if [ $? -eq 0 ];then action "$ip$n" /bin/true else action "$ip$n" /bin/false fi } & done #!/bin/bash CMD="nmap -sP" IP="192.168.165.0/24" func(){ $CMD $IP |grep "Nmap scan report for"|awk -F "[()]+" '{print $(NF-1)}' } func # for循环结合nc nc -w 1 10.0.0.61 -z 1-10000
企业实战题6:请用至少两种方法实现
写一个脚本解决DOS攻击,提示:根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP,监控频率每隔3分钟.防火墙命令为:iptables -I INPUT -s 10.0.1.10 -j DROP
1.根据Web日志分析出IP地址
awk '{print $1}' www_access.log|sort|uniq -c|sort -rn|head # 引用数组中一个不存在的元素时,元素被赋值为空字符串,参与运算时被当做0使用 # a是一个数组,相当于ip是键,值是出现次数. awk '{a[$1]++}END{for(k in a) print a[k],k}' www_access.log|sort -rn|head 69 10.0.0.1 37 10.0.0.5 10 172.16.1.51 7 172.16.1.61 3 10.0.0.6
2.IP的访问次数到100,就封掉
#!/bin/bash while true do # awk '{a[$1]++}END{for(k in a) print a[k],k}' www_access.log|sort -rn|head > /tmp/ip.log netstat -an|grep EST|awk -F "[ :]+" '{print $(NF-3)}'|sort|uniq -c > /tmp/ip.log # netstat -an|awk -F "[ :]+" '/EST.*$/{print $(NF-3)}'|sort|uniq -c > /tmp/ip.log exec < /tmp/ip.log while read line do ip=`echo $line|awk '{print $2}'` pv=`echo $line|awk '{print $1}'` if [ $pv -gt 100 ] && [ `iptables -nL|grep $ip|wc-l` -eq 0 ] then iptables -I INPUT -s $ip -j DROP fi done sleep 180 done