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

简介:

1、批量创建自带随机字符串的文件多种方法

本次运用到了$RANDOM变量

创建命令如下:

echo $RANDOM|md5sum|tr "[0-9]" "[a-z]"|cut -c 3-8

通过echo输出随机数,然后通过md5加密,再将数字转换为字母,然后取其中的10个

具体脚本实现如下:

1
2
3
4
5
6
7
#!/bin/bash
#echo $RANDOM|md5sum|tr "[0-9]" "[a-z]"|cut -c 3-8      
[ -d  "/oldboy"  ]||  mkdir  -p  /oldboy
for  in  ` seq  10`
do
    touch  /oldboy/ $( echo  $RANDOM|md5sum| tr  "[0-9]"  "[a-z]" | cut  -c 3-8)_oldboy.html
done

运行脚本:

1
[root@Python test001] # sh oldboy01.sh

查看结果:

1
2
3
4
[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] #


注释:获取随机字母:

1
2
[root@Python test001] # openssl rand -base64 40|sed 's#[^a-z]##g'
acgilbtgjwpkejryjybkg

所以以上的脚本可以改写为如下形式:

1
2
3
4
5
6
7
8
#!/bin/bash
Path= /oldboy
[ -d  "$Path"  ]||  mkdir  -p  /oldboy
for  in  ` seq  10`
do
    random=$( openssl  rand -base64 40| sed  's#[^a-z]##g' | cut  -c 2-11)
    touch  /oldboy/ ${random}_oldboy.html
done

运行脚本:

1
2
3
4
5
6
7
8
9
10
11
12
[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}

1
2
3
4
5
6
7
8
9
#!/bin/bash
Filename=_.oldgirl.HTML
Dirname= "/oldboy"
cd  $Dirname
for  in  ` ls  /oldboy `
do
   name=$( ls  /oldboy/ ${n}| awk  -F: '_'  '{print $1}' )
   mv  $n ${name}${Filename}
done

[root@Python test001]# 


或者

1
2
3
4
5
6
7
8
9
#!/bin/bash
Filename=_oldgirl.HTML
Dirname= "/oldboy"
cd  $Dirname
for  in  ` ls `
do
     name=$( echo  ${n}| awk  -F  '_'  '{print $1}' )
     mv  $n ${name}{Filename}
done

对以上脚本还是运用awk进行改写

1
2
3
4
#!/bin/bash
Path= "/oldboy"
cd  $Path && \
ls  $Path| xargs  -n1| awk  -F  '_'  '{print "mv "$0" "$1"_oldgirl.HTML"}' | bash

注释:这里的xargs -nl可要可不要,另外上述脚本中的mv可以用rename替代,即:

1
2
3
4
#!/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}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[ -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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/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($变量)}'


实现代码①

1
2
3
4
5
6
7
8
9
10
11
#!/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

实现代码②

1
2
3
4
5
6
7
8
9
10
11
#!/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

实现代码③

1
2
3
4
5
6
7
8
9
10
11
12
#!/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

实现代码④

1
2
3
4
[root@Python test001] # word="I am oldboy teacher"                    
[root@Python test001] # echo $word|xargs -n1|awk 'length >4{print $1}'
oldboy
teacher

实现代码⑤

1
2
3
4
5
6
7
[root@Python test001] # echo "I am oldboy teacher welcome to oldboy training"|tr " " "\n"|awk '{if (length($1)<=6) print $1}' 
I
am
oldboy
to
oldboy
[root@Python test001] #

5、比较两个整数大小并严格判断参数输入





      本文转自027ryan  51CTO博客,原文链接:http://blog.51cto.com/ucode/1737734,如需转载请自行联系原作者





相关文章
|
3月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
4天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
43 13
|
1月前
|
运维 监控 安全
盘点Linux服务器运维管理面板
随着云计算和大数据技术的迅猛发展,Linux服务器在运维管理中扮演着越来越重要的角色。传统的Linux服务器管理方式已经无法满足现代企业的需求,因此,高效、安全、易用的运维管理面板应运而生。
|
2月前
|
运维 监控 网络协议
|
1月前
|
缓存 运维 监控
【运维必备知识】Linux系统平均负载与top、uptime命令详解
系统平均负载是衡量Linux服务器性能的关键指标之一。通过使用 `top`和 `uptime`命令,可以实时监控系统的负载情况,帮助运维人员及时发现并解决潜在问题。理解这些工具的输出和意义是确保系统稳定运行的基础。希望本文对Linux系统平均负载及相关命令的详细解析能帮助您更好地进行系统运维和性能优化。
52 3
|
2月前
|
存储 运维 搜索推荐
|
1月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
2月前
|
Shell
Shell编程(下)
Shell编程(下)
110 1
|
2月前
|
Shell Linux Windows
Shell编程(上)
Shell编程(上)
47 1
|
2月前
|
Shell Linux 开发工具
下一篇
DataWorks