Shell实战(面试)


本文章是为了记录笔者平常遇到的一些有趣且重要的Shell编程实例,不涉及特别基础的知识的讲解,但会明确指出每个实例所涉及的知识点和多种思路及一些实用的方法。后续会持续进行更新


批量生成随机字符的文件名

一.要求:批量生成文件,要求文件名字随机生成且全部为10位的小写字母
二.思路:先生成随机字符,然后通过方法把字符中的大写字母和数字替换成小写字母,或者直接去掉

三.涉及知识点:
生成随机数的方法
(1)使用random
特点:随机数范围为0~32767,加密性不是很好,可以通过和md5sum搭配操作并截取来生成更加没有规律的随机数

[root@localhost application]# echo $RANDOM
32041
[root@localhost application]# echo $RANDOM
15603
[root@localhost application]# echo $RANDOM |md5sum|cut -c 10-20
c5d6e24eebd
#cut -c 截取第几位到第几位

(2)使用openssl产生随机数
特点:数字与大小写字符相结合,并且带上特殊字符,可以得到很长的位数

[root@localhost application]# openssl rand -base64 20
gFPC0GQ7ULl9dzuer3lB7k1bePA=

四.具体实现

通过RANDOM变量实现
[root@localhost test]# for i in `seq 10` ; do touch `echo $RANDOM |md5sum|cut -c  1-40|sed 's#[^a-z]##g'|cut -c 1-10`;done
[root@localhost test]# ls
aeeebaadab  baafcbedda  bdaaaedfbf  dedaacd  ecadadbcce  edbdebdeb  eedcfdfbff  fcecdcaeeb  feedebcccc  ffcaaefaba

通过openssl实现
[root@localhost test]# for i in `seq 10` ; do touch `openssl rand -base64 40|sed 's#[^a-z]##g' | cut -c 1-10` ;done
[root@localhost test]# ls
ebguimpswn  flshyoqoxn  izjokaxqxf  kdxygjiroj  mfaeopjzfh  opedlaczfu  srvtmnrjhx  szbsrnobhe  tdrqybsrcc  vatddlbizj

批量改名

一.要求:将以fuxiangyu开头的文件,将其中的abc_替换为空
二.思路:改名可以使用mv命令,通过文本处理工具和管道实现mv命令的拼接,或者可以使用专门的改名工具rename
三:涉及知识点
1.rename的使用
作用:将文件名中指定的内容进行替换

rename "被替换的字符串" "替换后的字符串" 文件名

[root@localhost test]# rm -rf
[root@localhost test]# touch fuxiangyuabc.txt
[root@localhost test]# rename "abc" "ABC" fuxiangyuabc.txt 
[root@localhost test]# ls

2.常见的对字符串改名的方法
(1)使用${string/<被替换字段>/替换字段}

[root@localhost test]# a=123abc789
[root@localhost test]# echo ${a/abc/456}
123456789

(2)使用sed进行替换(拼接mv命令)

[root@localhost test]# a=123abc789
[root@localhost test]# echo $a | sed 's#abc#456#g'
123456789

四.具体实现

创建文件作操作用
[root@localhost test]# touch fuxiangyuabc_{1..10}
[root@localhost test]# ls
fuxiangyuabc_1   fuxiangyuabc_2  fuxiangyuabc_4  fuxiangyuabc_6  fuxiangyuabc_8
fuxiangyuabc_10  fuxiangyuabc_3  fuxiangyuabc_5  fuxiangyuabc_7  fuxiangyuabc_9

1.使用变量自带的方法拼接mv命令
[root@localhost test]# for i in `ls fuxiangyu*`; do mv $i `echo ${i/abc_/}`;done
[root@localhost test]# ls
fuxiangyu1  fuxiangyu10  fuxiangyu2  fuxiangyu3  fuxiangyu4  fuxiangyu5  fuxiangyu6  fuxiangyu7  fuxiangyu8  fuxiangyu9

2.使用sed拼接mv命令的方法
[root@localhost test]# ls
fuxiangyuabc_1   fuxiangyuabc_2  fuxiangyuabc_4  fuxiangyuabc_6  fuxiangyuabc_8
fuxiangyuabc_10  fuxiangyuabc_3  fuxiangyuabc_5  fuxiangyuabc_7  fuxiangyuabc_9
[root@localhost test]# for i in `ls fuxiangyu*`; do mv $i `echo $i | sed 's#abc_##g'`;done
[root@localhost test]# ls
fuxiangyu1  fuxiangyu10  fuxiangyu2  fuxiangyu3  fuxiangyu4  fuxiangyu5  fuxiangyu6  fuxiangyu7  fuxiangyu8  fuxiangyu9

3.使用改名工具rename改名
[root@localhost test]# ls
fuxiangyuabc_1   fuxiangyuabc_2  fuxiangyuabc_4  fuxiangyuabc_6  fuxiangyuabc_8
fuxiangyuabc_10  fuxiangyuabc_3  fuxiangyuabc_5  fuxiangyuabc_7  fuxiangyuabc_9
[root@localhost test]# rename "abc_" "" fuxiangyu*
[root@localhost test]# ls
fuxiangyu1  fuxiangyu10  fuxiangyu2  fuxiangyu3  fuxiangyu4  fuxiangyu5  fuxiangyu6  fuxiangyu7  fuxiangyu8  fuxiangyu9

编写脚本生创建用户,并为用户随机生成密码,密码保存在文件中

这个脚本的实现是上述两个例子的结合,下面我们给出具体的实现
要求:创建十个用户,以fuxiangyu作为前缀,后接有“_编号”,比如fuxiangyu_1,并为其生成随机密码,生成的密码保存在根目录下的passwd文件下

以下是基本实现功能
[root@localhost /]# vim useradd.sh 
#!/bin/bash 
[ -f /passwd ] || touch /passwd    ###判断存放密码的文件是否存在,如果不存在则创建一个
user=fuxiangyu_                    ###定义文件名的前缀
for i in `seq 10`
do 
  useradd $user$i &>dev/null       ###创建用户
  passwd=`openssl rand -base64 40 |cut -c 1-10` ###使用随机数给用户生成密码
  echo $passwd | passwd --stdin $user$i &>/dev/null ###给用户添加密码
  [ $? -eq 0 ] && echo "user $user$i is ok" || echo "ERROR" ###判断创建用户是否成功,如果成功输出OK,否则报错
  echo "username=$user$i  passwd= $passwd" >> /passwd###将用户名和密码的对应打印到文件中
done

效果
[root@localhost /]# bash useradd.sh 
user fuxiangyu_1 is ok
user fuxiangyu_2 is ok
user fuxiangyu_3 is ok
user fuxiangyu_4 is ok
user fuxiangyu_5 is ok
user fuxiangyu_6 is ok
user fuxiangyu_7 is ok
user fuxiangyu_8 is ok
user fuxiangyu_9 is ok
user fuxiangyu_10 is ok
[root@localhost /]# tail -10 /etc/passwd
fuxiangyu_1:x:1001:1015::/home/fuxiangyu_1:/bin/bash
fuxiangyu_2:x:1002:1016::/home/fuxiangyu_2:/bin/bash
fuxiangyu_3:x:1003:1017::/home/fuxiangyu_3:/bin/bash
fuxiangyu_4:x:1004:1018::/home/fuxiangyu_4:/bin/bash
fuxiangyu_5:x:1005:1019::/home/fuxiangyu_5:/bin/bash
fuxiangyu_6:x:1006:1020::/home/fuxiangyu_6:/bin/bash
fuxiangyu_7:x:1007:1021::/home/fuxiangyu_7:/bin/bash
fuxiangyu_8:x:1008:1022::/home/fuxiangyu_8:/bin/bash
fuxiangyu_9:x:1009:1023::/home/fuxiangyu_9:/bin/bash
fuxiangyu_10:x:1010:1024::/home/fuxiangyu_10:/bin/bash

编写脚本批量删除用户

一.要求:将上述脚本产生的用户删除掉
二.分析:我们可以使用userdel命令或者修改配置文件/etc/passwd的方法来批量删除符合要求的用户
三.涉及知识点
1.Linux中的用户,一般普通用户和root用户使用的shell是/bin/bash,所以我们可以根据这一特点来找出普通用户

[root@localhost /]# cat /etc/passwd | grep /bin/bash |grep -v root
fuxiangyu_1:x:1001:1015::/home/fuxiangyu_1:/bin/bash
fuxiangyu_2:x:1002:1016::/home/fuxiangyu_2:/bin/bash
fuxiangyu_3:x:1003:1017::/home/fuxiangyu_3:/bin/bash
fuxiangyu_4:x:1004:1018::/home/fuxiangyu_4:/bin/bash
fuxiangyu_5:x:1005:1019::/home/fuxiangyu_5:/bin/bash
fuxiangyu_6:x:1006:1020::/home/fuxiangyu_6:/bin/bash
fuxiangyu_7:x:1007:1021::/home/fuxiangyu_7:/bin/bash
fuxiangyu_8:x:1008:1022::/home/fuxiangyu_8:/bin/bash
fuxiangyu_9:x:1009:1023::/home/fuxiangyu_9:/bin/bash
fuxiangyu_10:x:1010:1024::/home/fuxiangyu_10:/bin/bash

###首先筛选出使用/bin/bash的用户,然后再使用-v参数过滤出root用户

四.实现

[root@localhost /]# vim userdel.sh
 #!/bin/bash
for i in `cat /etc/passwd | grep fuxiangyu|awk -F ":" '{print $1}'`
do
  userdel $i
done

编写脚本实现数据的定时备份

数据的定时备份其实就是一个简单的定时任务,当然有时还需要对日志进行切割等的操作,这里就不给出太深了

 cp /var/log/httpd/access_log  /home/log.bak/access_log$(date +%Y%m%d-%H%M%S)

将上述语句直接加入到定时任务中即可
crontab -e  ###进入编辑定时任务的界面
00 00 * * * cp /var/log/httpd/access_log  /home/log.bak/access_log$(date +%Y%m%d-%H%M%S)


编写脚本删除七天前的数据备份

一.要求:找出指定目录下的建立时间超过七天的文件,并删除
二.思路:可以通过find的选项,来寻找符合要求的文件
三.涉及知识点:
1.find命令对文件的查找。可以根据时间,大小和权限等
四.具体实现

find /var/log/httpd/ -type f -mmtime +7 -exec rm -rf {} \;
具体更多的操作可以参见find的用法
注意 -exec的使用  后面要加 “{} \;

检测网络中的主机

一.要求:使用脚本检测192.168.10.0/24网段中的存活的主机
二.思路:使用ping命令或者nmap命令来检测网段中存活的主机
三.具体实现
1.使用ping命令

#!/bin/bash
net="192.168.10."      ###定义要检测的网段
for i in `seq 254`     ###设置范围
do
{
  ping -c 2 $net$i &>/dev/null  ###执行ping命令,指定次数为两次,并将输出结果放入/dev/null中
  [ $? -eq 0 ]&& echo "$net$i is accessible " ###判断ping命令的返回值如果返回值为0,则表示主机可到达,即存活

}&  ###批量执行ping命令可以提高侠侣
done



实验效果
[root@www /]# bash host_test.sh 
192.168.10.10 is accessible 
192.168.10.2 is accessible 
192.168.10.1 is accessible 

2.使用nmap ###nmap的使用方法这里就不再赘述

[root@www /]# vim host_test.sh 
#!/bin/bash
CMD="nmap -sn "
ip='192.168.10.0/24'
for i  in `$CMD $ip|awk -F " for " '{print $2}'`
do
 echo "$i is ok"
done

实现效果
[root@www /]# bash host_test.sh 
192.168.10.1 is ok
192.168.10.2 is ok
www.liusi.com is ok
(192.168.10.10) is ok

检测指定网站是否正常工作

一.要求:编写脚本实现检测网站是正常工作
二.思路:使用命令curl或者wget来对网站进行检测
三.实现
1.使用wget进行检测

#!/bin/bash
array=(           ###定义检查的对象组
      www.baidu.com
      www.4399.com
      www.51cto.com
      www.fuxiangyu999.com
)
for ((i=0;i<${#array[*]};i++))
 do
  wget --spider -q ${array[$i]}   ###wget的--spider选项
  [ $? -eq 0 ] && echo " ${array[$i]} is ok " || echo "${array[$i]}  is have a trouble"
 done
 ###通过wget的返回值来判断网站是否正常运作

效果
[root@www /]# bash web_check.sh 
 www.baidu.com is ok 
 www.4399.com is ok 
 www.51cto.com is ok 
www.fuxiangyu999.com  is have a trouble

2.使用curl进行检测

发布了24 篇原创文章 · 获赞 10 · 访问量 2365

猜你喜欢

转载自blog.csdn.net/flat0809/article/details/103136702
今日推荐