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

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

运行脚本:

[[email protected] test001]# sh oldboy01.sh

查看结果:

[[email protected] 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
[[email protected] test001]#

注释:获取随机字母:

[[email protected] 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

运行脚本:

[[email protected] 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

[[email protected] 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}

[[email protected] test001]# seq -w 10
01
02
03
04
05
06
07
08
09
10
[[email protected] test001]# echo {00..10}
00 01 02 03 04 05 06 07 08 09 10
[[email protected] test001]#

④随机密码,有如下6种方法
⑴ $RANDOM
[[email protected] test001]# echo $RANDOM|md5sum |cut -c 2-9
e691e92d
 
⑵ openssl #通过openssl产生随机数
[[email protected] test001]# openssl rand -base64 45
i9IzYMu6QCIxSPLt0BQdkFzhA3ydJ12Y4mjcCL4zFMjVqBPjEGDmCQ+n5lPF
[[email protected] test001]#

⑶ date命令

[[email protected] test001]# date +%s/%N #通过时间获取随机数

1453431452/536836731

[[email protected] test001]# date +%s/%N|md5sum|tr "[0-9]" "[0-9][a-zA-Z]"

54af7dcb18a35cda83f299c7f389b720  -

⑷通过head /dev/urandom|cksum #设备产生随机数

[[email protected] test001]# head /dev/urandom|cksum

2049066555 2401

[[email protected] test001]#

⑸通过uuid随机数

[[email protected] test001]# cat /proc/sys/kernel/random/uuid

1ea4deab-debc-4800-89d3-1817c198315b

[[email protected] test001]#

⑹通过exect随机数

[[email protected] test001]# yum -y install expect

[[email protected] test001]# mkpasswd -l 10 -d 5

kn5G51X;73

[[email protected] 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

[[email protected] test001]# echo old{01..10}|xargs -n1

old01

old02

old03

old04

old05

old06

old07

old08

old09

old10

[[email protected] test001]# echo old{01..10}|xargs -n2

old01 old02

old03 old04

old05 old06

old07 old08

old09 old10

[[email protected] test001]# echo old{01..10}|xargs -n3

old01 old02 old03

old04 old05 old06

old07 old08 old09

old10

[[email protected] test001]# echo old{01..10}|xargs -n4

old01 old02 old03 old04

old05 old06 old07 old08

old09 old10

b、运用sed语法替换

实现代码:

调试如下:

[[email protected] 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执行

[[email protected] 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

[[email protected] test001]#

运行脚本:

[[email protected] test001]# sh oldboy04-02.sh

[[email protected] 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

[[email protected] 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/tmp.log
while read line
do
 IP=`echo $line|awk ‘{print $2}‘`
 if [ `echo $line|awk ‘{print $1}‘` -ge $count -a `iptables -L -n|grep "$IP"|wc -l` -lt 1 ];then
       iptables -I INPUT -s $IP -j DROP
       RETVAL=$?
       if [ $RETVAL -eq 0 ];then
           action "$IP is  DROP" /bin/true
           echo "$IP" >>/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 class

思路:

首先需要取出每个单词然后查看每个单词的字符数,取单词有两种方法,如下:

⑴数组

⑵字符串(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

实现代码④

[[email protected] test001]# word="I am oldboy teacher"                    
[[email protected] test001]# echo $word|xargs -n1|awk ‘length >4{print $1}‘
oldboy
teacher

实现代码⑤

[[email protected] test001]# echo "I am oldboy teacher welcome to oldboy training"|tr " " "\n"|awk ‘{if (length($1)<=6) print $1}‘ 
I
am
oldboy
to
oldboy
[[email protected] test001]#
时间: 2024-12-23 23:14:46

最新Linux运维必会22道Shell编程面试题精彩讲解的相关文章

Linux运维 第二阶段 (九)shell编程

Linux运维 第二阶段 (九)shell编程 一.1.基础正则表达式: *         前一个字符匹配0次或任意多次 .         匹配除了换行符外任意一个字符 ^         匹配行首,例:^Hello,匹配以Hello开头的行 $         匹配行尾,例:Hello$匹配以Hello结尾的行 []        中括号中指定的一个字符,例:[0-9].[a-z] [^]       匹配中括号字符以外的任意一个字符,例:[^0-9].[^a-z] \         转

Linux运维必会MySQL30道基础命令

Linux运维必会MySQL 30道基础命令 老男孩老师教学与培训核心思想:重目标.重思路.重方法.重实践.重习惯.重总结. 版权声明:余连辉 本系列文档为<老男孩 Linux 运维实战培训中心>内部教学用教案,只允许 VIP 学员 个人使用,为保护大家的学习利益,禁止私自传播,违者将取消 VIP 学员资格.严重者我们将法律起诉.如果你已经参加本培训,即视为你已无条件接受上述内容说明! 联系方式: 意见投诉信箱:[email protected] 网站运维交流群:114580181 24605

合格linux运维人员必会的30道shell编程面试题及讲解

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://oldboy.blog.51cto.com/2561410/1632876 超深度讲解shell高级编程实战,截至目前shell编程课程国内培训机构最细的课程,不信请看学员表现的水平. 课程牛不牛,不是看老师.课表,而是看培养的的学生水平,目前全免费中伙伴们赶紧看啊. http://edu.51cto.com/course/course_id-5257.html 企业合格的lin

Linux运维都要会哪些shell编程技能?

在充斥着各种的互联网+的数字时代,Linux运维也越来越趋于自动化方向发展,越来越多的运维工作者奔跑在了自动化运维的路上.目前Linux系统下最流行的运维自动化语言就是shell和Python了. 两者之间,shell几乎是IT企业必须使用的运维自动化编程语言,特别是在运维工作中的服务监控.业务快速部署.服务启动停止.数据备份及处理.日制分析等环节里,shell是不可缺的.当然Python也是一门更适合处理复杂的业务逻辑,以及开发复杂的运维软件工具,实现通过web访问等.Shell是一个命令解释

linux运维、架构之路-shell编程入门

一.shell编程入门必备基础 1.vim编辑器的命令,vimrc设置 2.150个linux基础命令 3.linux中基础的系统服务crond,ssh网络服务,nfs,rsync,inotify,lnmp,sersync,nmap等 二.变量分类 1.全局变量 [[email protected] ~]# env HOSTNAME=nfs-server TERM=linux SHELL=/bin/bash HISTSIZE=1000 SSH_CLIENT=172.19.5.146 49184

Linux运维必会的MySQL企业面试题大全 推荐

Linux运维必会的MySQL企业面试题大全 推荐 (1)基础笔试命令考察 1.开启MySQL服务 /etc/init.d/mysqld startservice mysqld startsystemctl  start mysqld 2.检测端口是否运行 lsof -i :3306netstat -lntup |grep 3306 3.为MySQL设置密码或者修改密码 设置密码 mysql -uroot -ppassword -e "set passowrd for root = passow

MySQL数据库企业级应用实战(Linux运维必学) 套餐上线了。

为了满足广大运维朋友的要求,国内运维界顶尖实战加教育专家老男孩老师亲自主讲的 MySQL数据库企业级应用实战(Linux运维必学)上线了 http://edu.51cto.com/roadmap/view/id-66.html 本套餐一共16套核心DBA课程,祝你掌握运维人员需要掌握的数据库核心重点知识,春节前优惠发布(节后会恢复原价),想掌握DBA的运维伙伴们请抓紧下手,学习课程只是一个连接纽带,选择一个好的优秀的导师,作为自己的前进指路灯,是成就自己的关键. 本课程100%企业实战积累的精华

linux运维必会MySQL企业面试题近百个

众所周知,MySQL是所有IT企业中的重中之重,linux运维人员如果能掌握MySQL数据库技术,对未来的高薪职业发展非常有帮助! linux运维必会MySQL企业面试题近百个 http://user.qzone.qq.com/49000448/blog/1427333863

Linux运维 第二阶段 (八)shell基础

Linux运维第二阶段(八)shell基础 一.shell的两种主要语法:Bourne家族(sh/ksh/bash/psh/zsh);C家族(csh/tcsh). 注:bash和zsh在不同程度上支持csh的语法. #vi  /etc/shells                 (可查询linux支持的shell) 二.1.#echo  -e|-n  输出内容 -e      可支持反斜线\控制的字符转换(\\,\a,\b,\c,\e,\f\,\n,\r,\t,\v,\0mmm,\xhh) -