Shell脚本案例---1

1)在 /oldboy 目录下创建10个含随机小写字母的html文件,随机字母一共10位,类似于 “abcdefghij_oldboy.html"格式。

#!/bin/bash

##设置变量目录
path=/oldboy

##是否有/oldboy目录,如果没有,则创建目录
[ -d $path ] || mkdir $path

##查看是否有mkpasswd命令,且不输出任何内容
type mkpasswd &>/dev/null

##如果不存在命令,则$?等于1,就安装expect软件包(内含mkpasswd命令)
##如果存在命令,则输出”该命令已安装”
if [ $? -eq 1 ];then
  echo "mkpasswd is not installed"
  yum install -y expect &>/dev/null
  if [ $? -eq 0 ];then
    echo "mkpasswd has installed"
  fi
fi

##使用循环,生成10个随机数且给变量赋值,随机数是10个小写字母
##根据随机数,创建要求的目录文件
for n in {01..10}
do
  random=$(mkpasswd -l 10 -d 0 -c 10 -C 0 -s 0)
  echo $random
  touch $path/${random}_oldboy.html
done

2)对目录下的文件名进行批量修改

已知 /tmp 目录下有10个后缀名为txt的文件

[root@m01 tmp]# pwd
/tmp
[root@m01 tmp]# ls
01.txt  02.txt  03.txt  04.txt  05.txt  06.txt  07.txt  08.txt  09.txt  10.txt

要求修改后缀为html

#!/bin/bash

##设置变量
dir=/tmp

##进入/tmp目录
cd $dir

##使用rename 命令批量修改
rename "txt" "html" *

3)批量创建10个用户,并生成随机数作为用户密码。
也可以批量删除用户。用两个函数表示,可以随时调用。

#!/bin/bash

##批量创建用户函数
add(){
for i in {01..10}
  do
    user=oldboy$i
    useradd $user
    num=$(openssl rand -base64 10)
    echo $num|passwd --stdin $user
  done
}

##批量删除用户函数
del(){
for i in {01..10}
  do
    user=oldboy$i
    userdel $user
  done
}

##如果要创建用户,调用函数
add

##如果要删除用户,调用函数
del

4)ping 10.0.0.1 到 10.0.0.70
如果ping通,则返回ok信息

#!/bin/bash

cmd="ping -W 1 -c 1"
ip="10.0.0."
for i in $(seq 70)
  do
    {
    $cmd $ip$i &>/dev/null
    if [ $? -eq 0 ];then
      echo "$ip$i is ok"
    fi
    }&
  done

此处ping的参数, -W 1表示等待1秒钟,-c 1表示ping 一次
本机的IP是10.0.0.61
结果如下

[root@m01 scripts]# sh 4.sh 
10.0.0.1 is ok
10.0.0.2 is ok
10.0.0.61 is ok

5)给定数组以及数组内的字符串,打印出长度小于5的字符串,用3种不同方法。
关于数组,稍微说明一下。
定义数组 array=(a b c)
输出该数组的所有元素 echo ${array[*]}
输出该数组元素的个数 echo ${#array[*]}
输出该数组第一个元素 echo ${array[0]}

此处三个方法用了3个不同的函数

#!/bin/bash

##方法一
fun1(){
array=(I am oldboy teacher welcome to oldboy training class)

##条件循环语句,此处有两个小括号
for ((i=0;i<${#array[*]};i++))
  do
    if [ ${#array[i]} -le 5 ];then
      echo ${array[i]}
    fi
  done
}

##方法二
fun2(){
array=(I am oldboy teacher welcome to oldboy training class)

##直接遍历数组所有元素,并用expr计算长度,进行比较
for i in ${array[*]}
  do
    if [ `expr length $i` -le 5 ];then
      echo $i
    fi
  done
}

##方法三
fun3(){

##用字符串格式表示相应的元素
array="I am oldboy teacher welcome to oldboy training class"

##输出元素并用awk筛选
echo $array|awk '{for(i=0;i<=NF;i++) if(length($i)<=5) print $i}'
}

fun3

6)手动输入两个数组(空格隔开),比较大小

#!/bin/bash
fun1(){

##交互式输入数字
read -p "请输入两个数字:" a b

##如果a为空,或者b为空,则提示输入数字
[ -z $a ] || [ -z $b ] && {
  echo "请输入数字:"
  exit 1
}

##判断a和b是否是整数,并将结果保存至变量rel1和rel2
expr $a + 1 &>/dev/null
re1=$?
expr $b + 1 &>/dev/null
re2=$?

##如果是整数,rel1和rel2是0,否则是1
##因为只有整数和1相加才是整数,$?才是0
[ $re1 -ne 0 -o $re2 -ne 0 ] && {
  echo "请输入整数!!"
  ##不是整数,则重新进入函数循环
  fun1
}

##判断大小
[ $a -gt $b ] && {
  echo "$a大于$b"
}
[ $a -lt $b ] && {
  echo "$a小于$b"
}
[ $a -eq $b ] && {
  echo "$a等于$b"
}
}

##调用函数
fun1

7)一键选择部署LNMP或LAMP架构

#!/bin/bash

##交互式界面,初识界面显示内容
main(){
cat <<eof
  1.[install lnmp]
  2.[install lamp]
  3.[exit]
  pls input your selection:
eof

##提前准备好的对应一键化部署服务的脚本
file1=/server/scripts/lnmp.sh
file2=/server/scripts/lamp.sh

##输入初始界面给出的1、2、3的三个数字选项
read num

##判断输入的是否是整数,否则会提示重新输入
expr $num + 1 &>/dev/null
[ $? -ne 0 ] && {
  echo "you must input {1|2|3}"
  exit 0
}

##如果输入1,就选择安装LNMP
[ $num -eq 1 ] && {
  echo " start install lnmp"
  
  ##等待2秒钟
  sleep 2
  
  ##查看是否存在该脚本文件,若不存在,就创建一个脚本
  [ ! -f $file1 ] && {
  touch $file1
  echo "echo lnmp is starting" >$file1
  }

  ##执行脚本,不成功,则source一下
  [ ! -x $file1 ] && 
   { echo "scripts can not exec or not exist"
     source $file1
   }
  exit 0                              
}
[ $num -eq 2 ] && {
  echo " start install lamp"
  sleep 2
  [ ! -f $file2 ] && {
  touch $file2
  echo "echo lamp is starting" >$file2
  }
  [ ! -x $file2 ] && 
   { echo "scripts can not exec or not exist"
     source $file2
   }
  exit 0                              
}

##如果选择3,不安装架构,则打印“再见”并且退出
[ $num -eq 3 ] && echo "see you" && exit 3

##如果输入的数字不是1、2、3中的任意一个,则提示一下
[[ ! $num = [1-3] ]] && {
  echo "pls input {1|2|3}"
  
  ##重新调用函数
  main
}
}

##调用函数
main

8)监控web站点目录/var/html/www目录下的所有文件内容是否被恶意纂改,若改动,则发送邮件通知。并设置成5分钟一次的定时任务。

首先,做好数据模拟测试的环境准备。

##准备好少量数据在站点目录下
cp -a /etc/c* /var/html/www
cp -a /etc/d* /var/html/www

##建立初始文件指纹库
find /var/html/www -type f|xargs md5sum > /opt/zhiwen.db.ori

##建立初始的文件库
find /var/html/www -type f > /opt/wenjian.db.ori

先回顾一下几个常见的文件测试操作符。
-d 目录存在则为真
-f 普通文件存在则为真
-e 目录或普通文件存在则为真

#!/bin/bash
retval=0

##调整字符集
export LANG=en

##站点目录下已经有少量的数据
check_dir=/var/html/www

[ -e $check_dir ] || exit 1

##初始的文件指纹库
zhiwen="/opt/zhiwen.db.ori"

##初始的文件库(含文件数量和名字)
wenjian="/opt/wenjian.db.ori"
err="/opt/err.log"

[ -e $zhiwen ] || exit 1
[ -e $wenjian ] || exit 1

##执行指纹监测命令并得到返回值
md5sum -c --quiet /opt/zhiwen.db.ori &>>$err
retval=$?

##获取最新文件数量
find $check_dir -type f >/opt/wenjian.db_curr.ori

##对比文件数量和文件名
diff /opt/wenjian.db* &>>$err

##如果返回值不为0,表明原始指纹与新指纹不匹配,即文件内容有变化,可以通过被追加重定向的错误日志看到是哪个文件的变化。

##如果文件对比数量不为0,表明文件数量发生变化。
if [ $retval -ne 0 -o `diff /opt/wenjian.db*|wc -l` -ne 0 ];then
  ##uname -n表示主机名
  ##date +%F表示日期
  ##主题:哪一天哪台主机发生错误。并附带错误日志文件作为邮件内容。
  mail -s "`uname -n` $(date +%F) err" 发件人@163.com 收件人@qq.com<$err
else
  ##否则输出OK,并发送邮件通知
  echo "sites dir is ok"|mail -s "`uname -n` $(date +%F) is ok"
fi

centos7系统下的邮箱发送设置

tail -5 /etc/mail.rc

set from=发件人@163.com
set smtp=smtp.163.com
set smtp-auth-user=发件人@163.com
set smtp-auth-password=邮箱验证码(16位)
set smtp-auth=login

最后写在定时任务中。
本脚本的绝对路径是/server/scripts/site_dir.sh

[root@m01 scripts]# crontab -l
*/5 * * * * /bin/sh /server/scripts/site_dir.sh &> /dev/null

参考内容:
《跟老男孩学Linux运维:Shell编程实战》
(例题几乎都来自该书,加上了个人的理解与补充)

你可能感兴趣的:(shell,linux,shell)