SHELL脚本

1. 编写一个死循环测试脚本
1)执行脚本后打开firefox浏览器,访问http://server0.example.com/
2)如果firefox窗口被关闭,自动重启步骤1
提示:
!!!! 使用 while  true 死循环,调用 firefox  URL 操作

 
  1. #!/bin/bash

  2. while true

  3. do

  4. firefox http://192.168.122.37

  5. done

  • 1

2. 编写序列用户管理脚本
1)编写脚本 uadd.sh,能够批量添加用户 ceshi01、ceshi02、……、ceshi20
2)编写脚本 udel.sh,能够批量删除用户 ceshi01、ceshi02、……、ceshi20
提示:
!!!! 编号小于10的用户的名称前缀为 ceshi0,其余用户的前缀为 ceshi
!!!! 也可以用 seq  -w  1  20 生成等宽数列

 
  1. #!/bin/bash

  2. for i in $(seq -w 1 20)

  • do
  • useradd ceshi$i

  • done

    • 1

    3.  编写脚本 tc.sh,
        1)找出/usr/share/doc/下的所有文件
        2)如果文件的类型是text,则wc -l统计此文件的行数,显示“文件 xxx,一共 nn 行”
        3)最后显示“一共统计了 nn 个文件,累计总行数 nn 行”
    提示:
    !!!! 使用find命令列出所有目标文件
    !!!! 通过“file  文件路径…”检测文件类型,看结果是否出现 text 以便筛选

     
    1. #!/bin/bash

    2. #记录文件总数的变量

    3. fileNum=0

    4. #当前文件的行数

    5. currentFileRow=0

    6. #所有文件的行数

    7. totalRow=0

    8. for file in $(find /usr/share/doc/ -type f)

  • do
  • file $file | egrep -w 'text'

  • if [ $? -eq 0 ];then

  • currentFileRow=$(cat $file | wc -l)
  • echo "文本文件$file,一共$currentFileRow 行"
  • let fileNum++
  • let totalRow+=$currentFileRow

  • fi

  • done

  • echo "一共统计了$fileNum 个文件,累计总行数:$totalRow"

    • 1


    4. 编写脚本 /root/vhost_add,为server0快速添加新的虚拟Web主机
    1)虚拟主机的域名由脚本在执行时指定(./vhost_add  www0.example.com),若未指定域名,则提示正确用法后退出脚本
    2)如果指定FQDN的虚拟主机已经存在,提示“虚拟主机XX已存在”,退出脚本
    3)执行脚本后能够向 /etc/httpd/conf.d/vhosts.conf 添加新配置
    4)并为此虚拟机建立网页目录 /var/www/FQDN,首页内容为虚拟主机的域名
    5)在本机 /etc/hosts 文件末尾追加“172.25.0.11  虚拟Web主机域名”记录
    提示:
    !!!! 需提前准备好 httpd 服务器
    !!!! 通过检查 vhosts.conf 文件是否存在’.*ServerName.*域名.*”记录判断是否存在
    !!!! 追加记录用echo  ”文件内容” >>   文件路径

     
    1. #!/bin/bash

    2. if [ $# -eq 0 ];then

  • echo "Usage: $0 指定域名"

  • exit 1

  • fi

  • #判断/etc/httpd/conf.d/vhosts.conf是否存在,不存在则创建

  • if [ ! -e "/etc/httpd/conf.d/vhosts.conf" ];then

  • touch /etc/httpd/conf.d/vhosts.conf

  • fi

  • #检测虚拟主机是否添加过

  • egrep ".*ServerName.*$1.*" /etc/httpd/conf.d/vhosts.conf

  • if [ $? -eq 0 ];then

  • echo "虚拟主机 $1 已存在"

  • exit 2
  • fi
  • #截取域名以.分割的第一部分
  • firstDomain=$(echo $1 | cut -d. -f1)
  • #为虚拟主机的访问路径添加主页文件
  • if [ ! -e "/var/www/$firstDomain" ];then

  • mkdir /var/www/$firstDomain

  • fi
  • cd /var/www/$firstDomain

  • echo $1 > ./index.html

  • #新建虚拟Web主机
  • echo "<VirtualHost *:80>
  • ServerName $1

  • DocumentRoot /var/www/$firstDomain

  • </VirtualHost>" >> /etc/httpd/conf.d/vhosts.conf
  • #启动httpd服务并设置为开机自启
  • systemctl restart httpd.service
  • systemctl enable httpd.service
  • #在本机追加域名解析记录
  • echo "192.168.122.37 $1" >> /etc/hosts

  •  
  • #访问Desktop的虚拟web

  • firefox $1


  • 5. 为指定的一批计算机远程部署XX文件
    1. 需要部署的文件从网址 http://sever0.example.cm/a.html 获取
    2. 部署的目标位置 /tmp/a.html
    3. 目标计算机的IP地址存放在文件 ipadds.txt 中(172.25.0.11、172.25.0.10)
    4. 用于认证的身份信息:用户名 root、密码 redhat
    1. #/bin/bash
    2. for ip in $(cat /root/shell/Exercise01/ipTexts.txt)

    3. do

    4. expect << EOF

    5. spawn ssh -o StrictHostKeyChecking=no root@$ip

    6. expect "password" {send "redhat\r"}
    7. expect "#" {send "wget http://192.168.122.37/a.html -O /tmp/a.html\r"}
    8. expect "#" {send "exit\r"}
    9. expect "eof"
    10. EOF
    11. done
    6. 正则表示式操作练习
    1)新建测试文件 a.txt,内容如下
    Tarena IT Group. @2018-2028
    @ IN NS mail.tedu.cn
    bt bat bet boot booot keroot root rooty
    52:54:00:90:A7:A2
    [email protected]
    192.168.4.5 3.1415926
    1.2.3.4.5  No:6.7.8.9
    [email protected]
    mike:x:500:500::/home/mike:/bin/bash
    2)找出以b开始、t结尾,中间包含2~3个字母的字符串
    # egrep  -o  'b[a-z]{2,3}t'  a.txt
    3)找出包括大写字母的行、找出只包括数字或.的行
    # egrep  [A-Z]  a.txt
    # egrep  -v  [^0-9.]  a.txt
    4)找出正确的电子邮箱地址
    # egrep '[a-Z0-9_]{2,}@([a-Z0-9]+\.){1,3}[a-Z0-9]{2,}' a.txt
    5)找出以m结尾包括3个字符的独立字符串
    # egrep '\b..m\b' a.txt
    6)找出以数字开头、数字结尾的行
    # egrep '^[0-9].*[0-9]$' a.txt
    7)找出每行的第3个字符
    # egrep -o '^(.)(.)(.)' a.txt | cut -b 3
    8)找出每行的倒数第3个字符
    egrep -o '(.)(.)(.)$' a.txt | cut -b 1

    案例1:编写一键部署软件脚本
    案例2:启动脚本
    案例3:编写监控脚本
    案例4:编写安全检测脚本
    案例5:编写进度显示脚本

    1 案例1:编写一键部署软件脚本

    1.1 问题

    本案例要求编写脚本实现一键部署Nginx软件(Web服务器):

    1.2 步骤

    实现此案例需要按照如下步骤进行。

    步骤一:准备工作

    1)判断yum源是否可用

    通过yum repolist查看软件包数量是否大于0:

    1. [root@svr5 ~]# yum repolist
    2. [root@svr5 ~]# yum repolist | awk '/repolist/{print $2}'
    3. [root@svr5 ~]# yum repolist | awk '/repolist/{print $2}' |sed 's/,//'
    4. [root@svr5 ~]# N=$(yum repolist | awk '/repolist/{print $2}' |sed 's/,//')
    5. [root@svr5 ~]# [ $N –le 0 ] && echo 'yum 不可用'

    2)依赖包

    源码安装Nginx需要提前安装依赖包软件gcc,openssl-devel,pcre-devel

    步骤二:编写脚本

    1)参考脚本内容如下:

     
    1. #!/bin/bash

    2. yumNum=$(yum repolist | awk '/^repolist/{print $2}' | sed 's/,//')

  • if [$yumNum -le 0];then

  • echo "yum不可用"

  • exit 1

  • fi

  • yum -y install gcc openssl-devel pcre-devel

  • tar -xf nginx-1.12.2.tar.gz

  • cd nginx-1.12.2

  • ./configure

  • make

  • make install

  • 2)确认安装效果

    Nginx默认安装路径为/usr/local/nginx,该目录下会提供4个子目录,分别如下:

    /usr/local/nginx/conf 配置文件目录

    /usr/local/nginx/html 网站页面目录

    /usr/local/nginx/logs Nginx日志目录

    /usr/local/nginx/sbin 主程序目录

    主程序命令参数:

     
    1. [root@svr5 ~]# /usr/local/nginx/sbin/nginx //启动服务

    2. [root@svr5 ~]# /usr/local/nginx/sbin/nginx -s stop //关闭服务

    3. [root@svr5 ~]# /usr/local/nginx/sbin/nginx -V //查看软件信息

    2 案例2:启动脚本

    2.1 问题

    本案例要求编写Ngin启动脚本,要求如下:

    2.2 步骤

    实现此案例需要按照如下步骤进行。

    步骤一:编写脚本

    脚本通过位置变量1读取用户的操作指令,判断是start、stop、restart还是status。

    1)参考脚本内容如下

  • #!/bin/bash
  • yumNum=1读取用户的操作指令,判断是start、stop、restart还是status。

    1)参考脚本内容如下

  • #!/bin/bash
  • yumNum=(yum repolist | awk ’/^repolist/{print 2}' | sed 's/,//')
  • if [2}' | sed 's/,//')
  • if [yumNum -le 0];then

    • echo ”yum不可用”

    • exit 1

    • fi

    • yum -y install gcc openssl-devel pcre-devel

    • tar -xf nginx-1.12.2.tar.gz

    • cd nginx-1.12.2

    • ./configure

    • make

    • make install

    2)执行测试脚本:

     
    1. systemctl status nginx.service

    2. systemctl restart nginx.service

    3. systemctl enable nginx.service

    • 1

    3 案例3:编写监控脚本

    3.1 问题

    本案例要求编写脚本,实现计算机各个性能数据监控的功能,具体监控项目要求如下:

    • CPU负载
    • 网卡流量
    • 内存剩余容量
    • 磁盘剩余容量
    • 计算机账户数量
    • 当前登录账户数量
    • 计算机当前开启的进程数量
    • 本机已安装的软件包数量

    3.2 步骤

    实现此案例需要按照如下步骤进行。

    步骤一:准备工作

    1)查看性能数据的命令

    1. [root@svr5 ~]# uptime                            //查看CPU负载
    2. 15:31:30             //系统当前时间
      up 127 days,  3:00   //主机已运行时间,时间越大,说明你的机器越稳定。
      1 user               //用户连接数,是总连接数而不是用户数
      load average: 0.00, 0.00, 0.00         // 系统平均负载,统计最近1,5,15分钟的系统平均负载
    3. [root@svr5 ~]# ifconfig eth0                    //查看网卡流量
    4. [root@svr5 ~]# free                            //查看内存信息
    5. [root@svr5 ~]# df                                //查看磁盘空间
    6. [root@svr5 ~]# wc –l /etc/passwd                //查看计算机账户数量
    7. [root@svr5 ~]# who |wc –l                        //查看登录账户数量
    8. [root@svr5 ~]# rpm –qa |wc -l                    //查看已安装软件包数量

    步骤二:编写参考脚本

    1)脚本内容如下:

    [root@svr5 ~]# vim listen.sh

     
    1. #!/bin/bash

    2. ip=$(ifconfig eth0 | awk '/inet /{print $2}')

    3. echo "本机IP地址为:$ip"

    4. cpu=$(uptime | awk '{print $10}')

    5. echo "本机CPU最近5分钟的负载是:$cpu"

    6. net_in=$(ifconfig eth0 | awk '/RX p/{print $5}')

    7. echo "入站网卡流量为$net_in"

    8. net_out=$(ifconfig eth0 | awk '/TX p/{print $5}')

    9. echo "出站网卡流量为$net_out"

    10. menFree=$(free | awk '/^Mem/{print $4}')

    11. echo "内存剩余流量为$menFree"

    12. diskFree=$(df | awk '/\/$/{print $4}')

    13. echo "根分区剩余容量为$diskFree"

    14. users=$(cat /etc/passwd | wc -l)

    15. echo "计算机账户数量为$users 个"

    16. loginUsers=$(who | wc -l)

    17. echo "当前登录账户为$loginUsers"

    18. processNum=$(ps -aux | wc -l)

    19. echo "当前开启的进程数量为$processNum 个"

    20. softNum=$(rpm -qa | wc -l)

    21. echo "本机已安装的软件包有$softNum 个"

    • 1

    4 案例4:编写安全检测脚本

    4.1 问题

    本案例要求编写脚本,防止远程ssh暴力破解密码,具体监控项目要求如下:

    • 检测ssh登录日志,如果远程登陆账号名错误3次,则屏蔽远程主机的IP
    • 检测ssh登录日志,如果远程登陆密码错误3次,则屏蔽远程主机的IP

    4.2 步骤

    实现此案例需要按照如下步骤进行。

    步骤一:准备工作

    1)过滤帐户名失败的命令(登陆日志文件为/var/log/secure)

    1. [root@svr5 ~]# awk ‘/Invalid user/{print 10}' /var/log/secure
    2)过滤密码失败的命令

    [root@svr5 ~]# awk '/Failed password/{print $11}' /var/log/secure
  • 步骤二:编写参考脚本

    1)脚本内容如下:

    [root@svr5 ~]# vim test.sh

  • #!/bin/bash
  • awk '/Failed password/{print $11}' /var/log/secure | awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' | awk '10}' /var/log/secure
  • 2)过滤密码失败的命令

    [root@svr5 ~]# awk '/Failed password/{print $11}' /var/log/secure步骤二:编写参考脚本

    1)脚本内容如下:

    [root@svr5 ~]# vim test.sh

  • #!/bin/bash
  • awk '/Failed password/{print $11}' /var/log/secure | awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' | awk '1>3{print “远程登录密码错误3次以上的IP:”,2}'
  • awk '/Invalid user/{print $10}' /var/log/secure | awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' | awk '2}'
  • awk '/Invalid user/{print $10}' /var/log/secure | awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' | awk '1>3{print “远程登录用户错误三次以上的IP:”,2}'
  • 5 案例5:编写进度显示脚本5.1 问题本案例要求编写脚本,实现带进程显示的复制脚本,具体要求如下:

  • 默认Linux的cp命令不具有进度显示
  • 我们需要自己编写脚本实现进度显示
  • 可以使用进度条的方式,或者显示百分比的方式
  • 5.2 步骤实现此案例需要按照如下步骤进行。

    步骤一:编写参考脚本

    1)脚本内容如下:

    [root@svr5 ~]# vim test.sh

  • #!/bin/bash
  • progress(){
  • while :
  • do
  •         echo -ne '\033[43m#\033[0m'
  •         sleep 0.3
  • done
  • }
  • progress &
  • cp -r 2}'
  • 5 案例5:编写进度显示脚本5.1 问题本案例要求编写脚本,实现带进程显示的复制脚本,具体要求如下:

  • 默认Linux的cp命令不具有进度显示
  • 我们需要自己编写脚本实现进度显示
  • 可以使用进度条的方式,或者显示百分比的方式
  • 5.2 步骤实现此案例需要按照如下步骤进行。

    步骤一:编写参考脚本

    1)脚本内容如下:

    [root@svr5 ~]# vim test.sh

  • #!/bin/bash
  • progress(){
  • while :
  • do
  •         echo -ne '\033[43m#\033[0m'
  •         sleep 0.3
  • done
  • }
  • progress &
  • cp -r 12
  • kill2
  • kill!
  • 知识总结
    if [ i==2];then

    fi

    casei==2];then

    fi

    case1 in
    1)
    echo 1;;
    2)
    echo1;;
    2)
    echo1;;
    3)
    echo 1;;
    4)
    echo1;;
    4)
    echo1;;
    *)
    echo this is default;;
    esac

     

    环境变量
    USER  USER  UID PATH
    if[PATH
    if[USER == “root” ];then
    fi

    # 位置变量个数
    # 位置变量个数
    * 所有的位置参数
    ?存放上一次执行命令的结果
    if[?存放上一次执行命令的结果
    if[? -eq 0 ];then 
    fi

    循环 
    (for循环,列表循环:次数是固定的)
    for i in 值1 值2 值3
    do
    命令 
    done

    (while循环,条件循环:次数不是固定的)
    while 条件
    do
    命令
    [ let i++ ]
    done

    函数
    cecho(){
    echo -e “\033[1m1m2\033[0m”
    }
    cecho 32 OK
    cecho 33 OK

    区分 ”  ””  “
    “ ”: 引用整体,不屏蔽特殊符号含义   (“” 和 ‘’只有包含特殊符号才有区别,其他情况没有任何区别)
    echo “a   b”
    echo a    b
    ”: 引用整体,屏蔽特殊符号含义
    echo ‘a   b’
    echo a    b

    “ :里面放命令,返回执行结果
    ():放命令
    ():放命令
    []:计算
    {}: awk
    sed 3p

    sed和awk
    sed: vim 编辑文件
    awk: grep 过滤文件

    tr ‘[a-z]’ ‘[A-Z]’ < test.txt
    tr a b < 文件
    将竖的输出结果转换成横的
    seq 10 | tr ‘\n’  ’ ‘

    字符串比较
    == != -z
    read -p “输入用户名:” user
    if [ -z user] && exit

    expect
    expect << EOF
    spawn ssh -o StrictHost..
    expect "password" {send "xx\n"}
    expect "#"  {send "xx\n"}
    EOF

    vim 1.txt &    不影响其他命令的执行
    kill后面只能加ID号
    user] && exit

    expect
    expect << EOF
    spawn ssh -o StrictHost..
    expect "password" {send "xx\n"}
    expect "#"  {send "xx\n"}
    EOF

    vim 1.txt &    不影响其他命令的执行
    kill后面只能加ID号
    !最后一个后台进程的id号

    你可能感兴趣的:(SHELL脚本)