20道shell编程面试题-上

企业面试题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

猜你喜欢

转载自www.cnblogs.com/fawaikuangtu123/p/10905089.html
今日推荐