设为首页 收藏本站
查看: 711|回复: 0

最新Linux运维必会22道Shell编程面试题精彩讲解

[复制链接]

尚未签到

发表于 2018-8-28 10:34:26 | 显示全部楼层 |阅读模式
  1、批量创建自带随机字符串的文件多种方法
  本次运用到了$RANDOM变量
  创建命令如下:
  echo $RANDOM|md5sum|tr "[0-9]" "[a-z]"|cut -c 3-8
  通过echo输出随机数,然后通过md5加密,再将数字转换为字母,然后取其中的10个
  具体脚本实现如下:
#!/bin/bash  
#echo $RANDOM|md5sum|tr "[0-9]" "[a-z]"|cut -c 3-8
  
[ -d "/oldboy" ]|| mkdir -p /oldboy
  
for n in `seq 10`
  
do
  
   touch /oldboy/$(echo $RANDOM|md5sum|tr "[0-9]" "[a-z]"|cut -c 3-8)_oldboy.html
  
done
  运行脚本:
[root@Python test001]# sh oldboy01.sh  查看结果:
[root@Python test001]# ls -rt /oldboy/  
gdcffb_oldboy.html  fghgca_oldboy.html  jffffh_oldboy.html  dhbdec_oldboy.html  fgjehc_oldboy.html
  
ecfbca_oldboy.html  gigcfe_oldboy.html  deabbf_oldboy.html  jbfbia_oldboy.html  chacif_oldboy.html
  
[root@Python test001]#
  注释:获取随机字母:
[root@Python test001]# openssl rand -base64 40|sed 's#[^a-z]##g'  
acgilbtgjwpkejryjybkg
  所以以上的脚本可以改写为如下形式:
#!/bin/bash  
Path=/oldboy
  
[ -d "$Path" ]|| mkdir -p /oldboy
  
for n in `seq 10`
  
do
  
   random=$( openssl  rand -base64 40|sed 's#[^a-z]##g'|cut -c 2-11)
  
   touch /oldboy/${random}_oldboy.html
  
done
  运行脚本:
[root@Python test001]# ll -rth /oldboy/  
total 0
  
-rw-r--r-- 1 root root 0 Jan 22 09:58 uxodkflbvk_oldboy.html
  
-rw-r--r-- 1 root root 0 Jan 22 09:58 hegdftlpsg_oldboy.html
  
-rw-r--r-- 1 root root 0 Jan 22 09:58 dztkcvtris_oldboy.html
  
-rw-r--r-- 1 root root 0 Jan 22 09:58 uthjkiobcr_oldboy.html
  
-rw-r--r-- 1 root root 0 Jan 22 09:58 efzdhgafvp_oldboy.html
  
-rw-r--r-- 1 root root 0 Jan 22 09:58 ygxdfyqcyq_oldboy.html
  
-rw-r--r-- 1 root root 0 Jan 22 09:58 pxqaxozaim_oldboy.html
  
-rw-r--r-- 1 root root 0 Jan 22 09:58 ybbnmsuinc_oldboy.html
  
-rw-r--r-- 1 root root 0 Jan 22 09:58 ebvpjhaith_oldboy.html
  
-rw-r--r-- 1 root root 0 Jan 22 09:58 lzxgyzqrbd_oldboy.html
  2、批量修改文件名多种方法讲解
  本次涉及到了命令的拼接,运用for循环取出文件,然后通过awk以"_"进行分割,取出固定的后缀(print $1),然后运行mv命令将源文件$n改名为$name${Filename}
#!/bin/bash  
Filename=_.oldgirl.HTML
  
Dirname="/oldboy"
  
cd $Dirname
  
for n in `ls /oldboy`
  
do
  
  name=$(ls /oldboy/${n}|awk -F:'_' '{print $1}')
  
  mv $n ${name}${Filename}
  
done
  [root@Python test001]#
  或者
#!/bin/bash  
Filename=_oldgirl.HTML
  
Dirname="/oldboy"
  
cd $Dirname
  
for n in `ls`
  
do
  
    name=$(echo ${n}|awk -F '_' '{print $1}')
  
    mv $n ${name}{Filename}
  
done
  对以上脚本还是运用awk进行改写
#!/bin/bash  
Path="/oldboy"
  
cd $Path && \
  
ls $Path|xargs -n1|awk -F '_' '{print "mv "$0" "$1"_oldgirl.HTML"}'|bash
  注释:这里的xargs -nl可要可不要,另外上述脚本中的mv可以用rename替代,即:
#!/bin/bash  
Path="/oldboy"
  
cd $Path && \
  
ls $Path|xargs -n1|awk -F '_' '{print "rename "$0" "$1"_oldgirl.HTML"}'|bash
  3、批量创建10个系统账号并设置密码多种方法
  运用到的知识点:
  ①useradd oldboy01
  ②echo "pass"|passwd --stdin oldboy
  ③给创建账号前加0,有两种方法:
  1、seq -w 10
  2、echo {00..10}
[root@Python test001]# seq -w 10  
01
  
02
  
03
  
04
  
05
  
06
  
07
  
08
  
09
  
10
  
[root@Python test001]# echo {00..10}
  
00 01 02 03 04 05 06 07 08 09 10
  
[root@Python test001]#
  

  
④随机密码,有如下6种方法
  
⑴ $RANDOM
  
[root@Python test001]# echo $RANDOM|md5sum |cut -c 2-9
  
e691e92d
  

  
⑵ openssl #通过openssl产生随机数
  
[root@Python test001]# openssl rand -base64 45
  
i9IzYMu6QCIxSPLt0BQdkFzhA3ydJ12Y4mjcCL4zFMjVqBPjEGDmCQ+n5lPF
  
[root@Python test001]#
  ⑶ date命令
  [root@Python test001]# date +%s/%N #通过时间获取随机数
  1453431452/536836731
  [root@Python test001]# date +%s/%N|md5sum|tr "[0-9]" "[0-9][a-zA-Z]"
  54af7dcb18a35cda83f299c7f389b720  -
  ⑷通过head /dev/urandom|cksum #设备产生随机数
  [root@Python test001]# head /dev/urandom|cksum
  2049066555 2401
  [root@Python test001]#
  ⑸通过uuid随机数
  [root@Python test001]# cat /proc/sys/kernel/random/uuid
  1ea4deab-debc-4800-89d3-1817c198315b
  [root@Python test001]#
  ⑹通过exect随机数
  [root@Python test001]# yum -y install expect
  [root@Python test001]# mkpasswd -l 10 -d 5
  kn5G51X;73
  [root@Python test001]#
  实现代码如下:
  #!/bin/bash
[ -f /etc/init.d/functions ]&& source /etc/init.d/functions  
[ $UID -ne 0 ]&&{echo "pls sudo to root "}
  
for  user in oldgirl{00..10}
  
do
  
  work=$(grep "\b$user\b" /etc/passwd|wc -l)
  
  if [ $work -eq 1 ];then
  
       action "Useradd $user already exists" /bin/false
  
       continue
  
  fi
  
  pass=$(echo $RANDOM|md5sum|cut -c 1-8)
  
  useradd $user && echo "pass"|passwd --stdin $user &>/dev/null
  
  RETVAL=$?
  
  if [ $RETVAL -eq 0 ];then
  
        action "Useradd $user is OK" /bin/true
  
  fi
  
  echo -e "\033[32m"$user"\033[0m \t \033[31m "$pass"\033[0m">>/tmp/user.txt
  
done
  注释:上述脚本设计到了知识点:
  a、引用系统函数库
  b、判断要创建的用户是否存在运用到了"grep \b$user\b"精确匹配,把grep "\b$user\b" /etc/passwd|wc -l 赋值给一个变量,将判断用户是否存在转换为判断变量值是否为1
  c、在处理创建用户和生产随机密码时,运用&&符号,让账户产生成功后就赋给密码
  d、判断运行脚本用户身份是否为root,如果不是则打印提示语句
  另外一种方式实现(命令行)
  运用知识点:
  a、xargs -nn
  将前面的内容通过管道交给xargs -n处理,拆分成列,后面n取值为1,2,3,4,5
  [root@Python test001]# echo old{01..10}|xargs -n1
  old01
  old02
  old03
  old04
  old05
  old06
  old07
  old08
  old09
  old10
  [root@Python test001]# echo old{01..10}|xargs -n2
  old01 old02
  old03 old04
  old05 old06
  old07 old08
  old09 old10
  [root@Python test001]# echo old{01..10}|xargs -n3
  old01 old02 old03
  old04 old05 old06
  old07 old08 old09
  old10
  [root@Python test001]# echo old{01..10}|xargs -n4
  old01 old02 old03 old04
  old05 old06 old07 old08
  old09 old10
  b、运用sed语法替换
  实现代码:
  调试如下:
  [root@Python test001]# echo old{01..10}|xargs -n1|sed -r 's#(.*)#useradd \1;pass=$(echo $RANDOM|md5sum|cut -c 1-8);echo "$pass"|passwd --stdin \1;echo -e "\1" \t "$pass">>/tmp/use.txt#g'
  useradd old01;pass=$(echo $RANDOM|md5sum|cut -c 1-8);echo "$pass"|passwd --stdin old01;echo -e "old01"   "$pass">>/tmp/use.txt
  useradd old02;pass=$(echo $RANDOM|md5sum|cut -c 1-8);echo "$pass"|passwd --stdin old02;echo -e "old02"   "$pass">>/tmp/use.txt
  useradd old03;pass=$(echo $RANDOM|md5sum|cut -c 1-8);echo "$pass"|passwd --stdin old03;echo -e "old03"   "$pass">>/tmp/use.txt
  useradd old04;pass=$(echo $RANDOM|md5sum|cut -c 1-8);echo "$pass"|passwd --stdin old04;echo -e "old04"   "$pass">>/tmp/use.txt
  useradd old05;pass=$(echo $RANDOM|md5sum|cut -c 1-8);echo "$pass"|passwd --stdin old05;echo -e "old05"   "$pass">>/tmp/use.txt
  useradd old06;pass=$(echo $RANDOM|md5sum|cut -c 1-8);echo "$pass"|passwd --stdin old06;echo -e "old06"   "$pass">>/tmp/use.txt
  useradd old07;pass=$(echo $RANDOM|md5sum|cut -c 1-8);echo "$pass"|passwd --stdin old07;echo -e "old07"   "$pass">>/tmp/use.txt
  useradd old08;pass=$(echo $RANDOM|md5sum|cut -c 1-8);echo "$pass"|passwd --stdin old08;echo -e "old08"   "$pass">>/tmp/use.txt
  useradd old09;pass=$(echo $RANDOM|md5sum|cut -c 1-8);echo "$pass"|passwd --stdin old09;echo -e "old09"   "$pass">>/tmp/use.txt
  useradd old10;pass=$(echo $RANDOM|md5sum|cut -c 1-8);echo "$pass"|passwd --stdin old10;echo -e "old10"   "$pass">>/tmp/use.txt
  将调试结果的交给bash执行
  [root@Python test001]# echo old{01..10}|xargs -n1|sed -r 's#(.*)#useradd \1;pass=$(echo $RANDOM|md5sum|cut -c 1-8);echo "$pass"|passwd --stdin \1;echo -e "\1" \t "$pass">>/tmp/use.txt#g'|bash
  将初始代码进行拓展(运用ckpasswd命令):
  #!/bin/bash
  [ -f /etc/init.d/functions ]&& source /etc/init.d/functions
  [ $UID -ne 0 ]&&{echo "pls sudo to root "}
  for  user in admin{00..10}
  do
  work=$(grep "\b$user\b" /etc/passwd|wc -l)
  if [ $work -eq 1 ];then
  action "Useradd $user already exists" /bin/false
  continue
  fi
  pass=$(echo $RANDOM|md5sum|cut -c 1-8)
  useradd $user && echo "$user:$pass"|tee >>/tmp/userlist.log|chpasswd
  done
  [root@Python test001]#
  运行脚本:
  [root@Python test001]# sh oldboy04-02.sh
  [root@Python test001]# cat /tmp/userlist.log
  admin00:9ed66b14
  admin01:29af36b7
  admin02:48929baa
  admin03:8d541efd
  admin04:0f8ea01f
  admin05:994f8644
  admin06:109e40a2
  admin07:5c5a654b
  admin08:9959dbbf
  admin09:6847874d
  admin10:4412f63c
  [root@Python test001]#
  3、开发脚本解决DOS***生产案例多种方法讲解
  写一个脚本解决DOS***生产案例
  提示:提示根据web日志或者网络连接数监控当某个IP并发连接数或者短内PV达到100,即调用防火墙命令封掉对应的IP,监控频率为每隔3分钟
  根据web日志分析:日子文件为access_2016-01-22.log
#!/bin/bash  
[ -f /etc/init.d/functions ] && source /etc/init.d/functions
  
Path=/root/system/test001/access_2016-01-22.log
  
count=10
  
function ipt(){
  
awk '{print $1}' $Path|sort|uniq -c|sort -nr -k1 >/tmp/tmp.log
  
exec >/tmp/ip_$(date +%F).log
  
       else
  
            action "$IP is DROP" /bin/false
  
       fi
  
fi
  
done
  
}
  
function del(){
  
[ -f /tmp/ip_$(date+%F -d '-1day').log ]||{echo "ip_$(date+%F -d '-1day').log is not exist";exit 1}
  
exec >/tmp/ip_$(date+%F -d '-1day').log
  
while read line
  
do
  
if [ `iptables -L -n|grep "$line"|wc -l` -ge 1 ];then
  
       iptables -D INPUT -s $line -j DROP
  
fi
  
done
  
}
  
main(){
  
   flag=0
  
   while true
  
   do
  
       sleep 3
  
       ((flag++))
  
       ipt
  
       [ $flag -ge 3 ] && del && flag=0
  
   done
  
}
  
main
  4、输出一堆英文其中字母数不大于6的单词(昆仑万维面试题)

  I am oldboy teacher welcome to oldboy training>  思路:
  首先需要取出每个单词然后查看每个单词的字符数,取单词有两种方法,如下:
  ⑴数组
  ⑵字符串(wc -w 去字符的单词数)
  取单词长度的方法:
  ①${#变量}
  ②wc -L
  ③wc -c(比字符串长度多1,因为多了换行符)
  ④${变量:0:6}对比原变量
  ⑤expr length "变量"
  ⑥awk '{print length($变量)}'
  实现代码①
#!/bin/bash  
array=(I am oldboy teacher welcome to oldboy training class)
  
funFirst(){
  
     for word in  ${array
  • }
      
         do
      
            if [ ${#word} -le 6 ];then
      
                echo $word
      
            fi
      
         done
      
    }
      
    funFirst
      实现代码②
    #!/bin/bash  
    array=(I am oldboy teacher welcome to oldboy training class)
      
    funFirst(){
      
         for word in  ${array
  • }
      
         do
      
            if [ $(echo $word|wc -L) -le 6 ];then
      
                echo $word
      
            fi
      
         done
      
    }
      
    funFirst
      实现代码③
    #!/bin/bash  
    array=(I am oldboy teacher welcome to oldboy training class)
      
    funFirst(){
      
         for word in  ${array
  • }
      
         do
      
             check=$(echo $word|awk '{print length ($word)}')
      
            if [ $check -le 6 ];then
      
                echo $word
      
            fi
      
         done
      
    }
      
    funFirst
      实现代码④
    [root@Python test001]# word="I am oldboy teacher"  
    [root@Python test001]# echo $word|xargs -n1|awk 'length >4{print $1}'
      
    oldboy
      
    teacher
      实现代码⑤
    [root@Python test001]# echo "I am oldboy teacher welcome to oldboy training"|tr " " "\n"|awk '{if (length($1)

  • 运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
    2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
    3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
    4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
    5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
    6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
    7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
    8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

    所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-557628-1-1.html 上篇帖子: shell变量 set env export的区别 下篇帖子: SHELL编程四剑客练习--awk
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    扫码加入运维网微信交流群X

    扫码加入运维网微信交流群

    扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

    扫描微信二维码查看详情

    客服E-mail:kefu@iyunv.com 客服QQ:1061981298


    QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


    提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


    本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



    合作伙伴: 青云cloud

    快速回复 返回顶部 返回列表