最新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,如需转载请自行联系原作者





相关文章
|
算法 Linux Shell
Linux实用技能:打包压缩、热键、Shell与权限管理
本文详解Linux打包压缩技巧、常用命令与原理,涵盖.zip与.tgz格式操作、跨系统传文件方法、Shell运行机制及权限管理,助你高效使用Linux系统。
Linux实用技能:打包压缩、热键、Shell与权限管理
|
12月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
978 9
|
12月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
1019 2
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
1392 1
|
Linux Shell 数据安全/隐私保护
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
734 3
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
498 4
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
2735 2