shell编程--企业面试题

linux下批量修改文件网址:

http://oldboy.blog.51cto.com/2561410/711342

1.企业面试题1:

在/oldboy目录下,创建oldboy-{1-10}文件(用for循环实现)。

方法一:

#bin!bash
[ !-d /oldboy ] && mkdir /oldboy
for f in `seq 10`
do
 touch /oldboy/oldboy-$f
done

方法二:

 cd   /oldboy

 touch  oldboy-{1..10}

2.企业面试题2:

将以上文件名中的oldboy全部改成linux(用for循环实现)。

提示:以后再考大家把文件名中的oldboy批量替换成linux,并且扩展名改成大写

方法一:

#bin!bash
[ -d /oldboy ] && cd oldboy
for f in `ls oldboy*`
do
 mv $f `echo $f | sed 's#oldboy#linux#g'`
done

方法二:(不用for循环)rename重命名命令

rename oldboy  linux  *oldboy*   
# from:改的对象   to:将from改成什么  file:对什么文件改


3.企业面试3

创建是个用户,并产生密码(密码不重复)

方法:
for i in `seq -w 10`
do
 useradd  oldboy$i  &&  echo  "oldboy$i"  | passwd   --stdin oldboy$i  (对用户修改密码)
done

4.企业面试题4:
批量创建10个系统帐号oldboy01-oldboy10并设置密码(密码为随机8位字符串)。
随机数产生:
1.echo $RANDOM
产生8位随机数:
 echo $RANDOM | md5sum| cut -c 1-8
2.openssl产生随机数
openssl  rand -base64 8
3.date 通过时间获得随机数
date +%s%N | md5sum| cut -c 1-8
方法:

for i in `seq -w 10`
do
 pass=`echo $RANDOM| md5sum | cut -c 1-8`
 useradd  oldboy$i  &&  \
  echo  " $pass"  | passwd   --stdin oldboy$i  (对用户修改密码)
 echo -e " user: oldboy$i  \t  pass:$pass" >> /tmp/user.log
done 

数字加0的思路:http://oldboy.blog.51cto.com/2561410/788422


5.企业面试5

 测试网络是否连接

 解答:ping是否通

   ping通后,返回值为0  (echo $? 为0)

#/bin/bash
for n in `seq 254`
do
   ping -c2  10.0.0.$n >/dev/null 2 >$1
   if [ $? -eq 0 ]
   then
      echo "10.0.0.$n is up ">>/tmp/uplist.log
    else
      echo "10.0.0.$n is up">>/tmp/downlist.log
   fi
done

6.企业面试6
写一个脚本解决DOS攻击生产案例
提示:根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP,监控频率每隔3分钟。防火墙命令为:iptables -A INPUT -s 10.0.1.10 -j DROP

解答:

方法一:

web 也可以分析日志,把单IP  PV数高的封杀掉

awk    ' {print  $1} '  access.log | grep  -v "^$"  |sort  | uniq -c 

(grep  -v  "^$"  去除空行)

(uniq -c  排重复  添序号)

  4  10.0.0.31

  3 10.0.0.32

  1  10.0.0.35

#/bin/bash
while true
do
       awk    ' {print  $1} '  access.log | grep  -v "^$"  |sort |uniq  -c > /tmp/tmp.log
       exec < /tmp/tmp.log
       while  read line
	do
   	    ip=` echo $line | awk '  {print  $2} '  `
            count=` echo $line| awk  '{print $1} '  `
    	    if [ $count  -gt  100 ]   &&  [ `iptables  -nL |  grep  "$ip" | wc -l`  -lt 1  ]   (防止iptables策略添加太多)
  		then
                 iptables  -I   INPUT  -s  $ip   -j   DROP
		echo  " $line  is dropped"  >>  /tmp/droplist.log
            fi
       done
      sleep  5  (每5秒执行一次)
done    


方法二:网络连接数 netstat         

协议  收到   发送    本地地址  外部地址   状态  (6列)

TCP    0           0   192,0,0,:900   192,178.0:800   ESTTABLESD

  netstat  -an | grep  EST  |awk  -F  ' [ :]+'  ' {print  $6} '        (-F [  : ]空格和:分隔的) []中间一个空格一个:

 netstat  -an | grep  EST  |awk  -F  ' [ :]+'  ' {print  $6} '  |  sort |  uniq -c

   1  12.117.81..1

   8  180.118.186.0

   1  202.0.0.20


 grep  EST  |awk  -F  ' [ :]+'  ' {print  $6} '  |  sort |  uniq -c

#/bin/bash
while true
do
       grep  EST a.log |  awk  -F  '[ :]+'  '{print $6}' |sort |uniq  -c > /tmp/tmp/log
       exec < /tmp/tmp.log
       while  read line
	do
   	    ip=` echo $line | awk '  {print  $2} '  `
            count=` echo $line| awk  '{print $1} '  `
    	    if [ $count  -gt  100 ]   &&  [ `iptables  -nL |  grep  "$ip" | wc -l`  -lt 1  ]   (防止iptables策略添加太多)
  		then
                 iptables  -I   INPUT  -s  $ip   -j   DROP
		echo  " $line  is dropped"  >>  /tmp/droplist.log
            fi
       done
      sleep  5  (每5秒执行一次)
done 

7.企业面试题7

mysql分库备份脚本

<pre name="code" class="objc">#!/bin/bash
MYUAER=root
MYPASS=oldboy
CmdPath=”/application/mysql/bin
SOCK=/data/ 3306 /mysql.sock"
MYCMD=" mysql   -u$MYUSER  -p$MYPASS   -S  $SOCKET"
MYDUMP=" mysqldump   -u$MYUSER  -p$MYPASS   -S  $SOCKET"
for  database  in  oldboy  ff   dd  (for  database in `#MYCMD  -e "show databeaes;" | sed '1,2d' | egrep  -v "mysql | schema"`  去掉前两行说明,即为所有数据库的库名,完成对其所有库备份,排除mysql schema,否则会报错,但是不排除也可以备份)
do 

	$MYDUMP    $database |  gzip  >   /server/backup/${database}_$(data +%F).sql.gz
done
</pre><pre>

最后会生成:

dd_2014-2-1.sql.gz

ff_2014-2-1.sq;.gz

oldboy_2012-2-1.sql.gz

mysql分表备份

#!/bin/bash
MYUAER=root
MYPASS=oldboy
CmdPath=”/application/mysql/bin
SOCK=/data/ 3306 /mysql.sock"
MYCMD=" mysql   -u$MYUSER  -p$MYPASS   -S  $SOCKET"
MYDUMP=" mysqldump   -u$MYUSER  -p$MYPASS   -S  $SOCKET"
for  database in `#MYCMD  -e "show databeaes;" | sed '1,2d' | egrep  -v "mysql | schema"`  
do 
        mkdir  /server/backup/${database}  -p
      for  table in `$MYCMD  -e  "show tables  from &database;" | sed '1d'`  (第一行去掉,剩下为所有表名)
      do
	$MYDUMP    $database  $table|  gzip  >   /server/backup/${database}/${database}_${table}_$(data +%F).sql.gz
     done
done
 会生成:/server/backup/dd     /server/backup/ff目录在其目录下生成对应的表 

tree  /server/backup

8.企业面试8

把单词中字母个数大于6的打印出来

for word  in  i  am oldboy  teacher  welcome to  oldboy  training  class.
do
    [ ${#word}  -le  6]  && echo  $word  (#word代表word单词个数)
done 
     或者: [  echo  $word | wc  -L  -le  6  ]

</pre><pre name="code" class="objc">#!/bin/bash
array=(i am oldboy  teacher  welcome to oldboy training class)
for((i=0; i<${#array[@]};i++))
do
    if [ `expr length "${array[$i]}"` -le 6 ]
	then 
     echo  ${array[i]}
    fi
done


9.企业面试9
从第一行开始间隔10行打印,直到51行结束
seq 1 10  51  (从1 到51  步长10,隔十取)
1 11 21  31  41  51
sed  -n  '1p'  /etc/services   (取第一行)

方法一:

#!/bin/bash
for  n in `seq  1  10  51`
do
       sed  -n  '”${n}p“   /etc/services (-n取消默认输出,${n}p是说np是变量,是为了让系统知道n是变量,所以加上{n}p)
done

方法二:

sed  -n  '1~10p'  /etc/services  (~10代表步长10)

方法三:(awk)

seq 10 >oldboy.txt

awk ' { if (NR>2&&NR<6)  print  $0}'  oldboy.txt   (打印3-5行   $0打印整行)

awk   ' { if (NR%10 ==1) print  $0} '    /etc/services   (行对10取余为1打印)






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值