Shell脚本练习

通过shell脚本分析部署nginx网络服务

1.接收用户部署的服务名称

2.判断服务是否安装

​    已安装;自定义网站配置路径为/www;重启服务    

​    没有安装;安装对应的软件包

3.测试

 判断服务是否成功运行;

​        已运行,访问网站

​        未运行,提示服务未启动,并显示自定义的配置文件内容

4.以上配置没有问题,请邮件告知我,并将脚本代码(代码文件)邮件发送我

我的邮箱账号:xxxxxx@163.com

一、整体流程分析

  1. 接收用户输入:脚本首先需要接收用户输入的要部署的服务名称,以此来确定后续针对该服务(这里明确是 nginx)的操作。
  2. 服务安装状态判断及处理
    • 已安装情况:如果判断出 nginx 已经安装,那么需要进行一系列自定义配置操作,包括设定自定义网站配置路径(这里指定为 /www),并且在该路径下创建共享目录以及网页文件,最后还要重启 nginx 服务。
    • 未安装情况:若发现 nginx 未安装,则要执行相应的安装操作
  3. 服务运行状态测试及处理:在完成前面的安装或配置操作后,需要测试 nginx 服务是否成功运行。
    • 已运行情况:如果 nginx 服务已运行,告知用户可以通过浏览器访问网站。
    • 未运行情况:若 nginx 服务未运行,除了提示服务未启动外,还需要显示自定义的配置文件内容(这里应该是指之前创建的网页文件内容等),以便用户进一步排查问题。
  4. 邮件通知及脚本发送:当完成上述所有关于 nginx 部署及测试的操作后,如果整个过程没有问题,需要通过邮件告知用户,并且要将脚本代码本身作为附件一并发送给用户。

二、具体步骤分析

1. 接收用户部署的服务名称

通过read命令来提示用户输入要部署的服务名称,并将用户输入的内容存储到一个变量中,以便后续进行判断和处理。

2. 判断服务是否安装及相应处理

已安装情况

  • 确认安装状态:可以使用which nginx命令来检查 nginx 是否已经安装。如果该命令执行后输出为空(通过重定向)&> /dev/null 将标准输出和错误输出都丢弃,若有输出说明找到了可执行文件,即已安装),则说明 nginx 已安装。
    • Linux上查找软件是否安装的命令
      • rpm -qa | grep <软件包名称>
      • which <命令名>
      • command -v <命令名>

which”命令会查找 “nginx” 这个命令在系统中的可执行文件路径

  • 如果系统中已经安装了 Nginx,那么它会返回 Nginx 可执行文件所在的路径
  • 如果系统中没有安装 Nginx,那么它通常不会返回任何内容

  • 标准输出一般用于输出命令正常执行的结果——用文件描述符 1 表示
  • 标准错误输出则用于输出命令执行过程中出现的错误信息——用文件描述符 2 表示
  • >:用于将标准输出重定向到一个指定的文件或设备。例如,echo "Hello" > file.txt会把 “Hello” 这句话的输出从默认的终端显示重定向到file.txt文件中,也就是会创建或覆盖file.txt` 文件并写入 “Hello“
  • >>  :与 “>类似,但它是追加模式,即如果指定的文件已经存在,不会覆盖原有内容,而是在文件末尾追加新的内容
  • /dev/null  :数据黑洞,任何写入其中的数据都会被丢弃
  • 自定义配(写在函数内,在脚本中直接调用)
    • 创建自定义网站配置路径:使用mkdir -p命令创建指定的网站配置路径(/www),-p选项确保即使父目录不存在也能创建成功。
    • 创建共享目录和网页文件:在已创建的网站配置路径下,使用touch命令创建一个网页文件(如index.html),并通过重定向操作(如echo "this is test" >)向该网页文件写入一些测试内容。
    • 重启服务:使用systemctl restart nginx命令来重启 nginx 服务,以使前面的配置更改生效。

未安装情况

  • 确认安装状态:与已安装情况判断相反
  • 安装对应的软件包
    • 执行安装命令

3. 测试服务是否成功运行及相应处理

已运行情况

  • 使用systemctl is-active nginx或者通过$? -eq 0判断上一个命令的退出状态码是否为 0
    在 Linux 中,一般来说,命令执行成功时退出状态码为 0,执行失败时为非 0 值
    来检查 nginx 服务是否处于活动状态(即已运行)。

未运行情况

  • 提示服务未启动外,还需要显示自定义的配置文件内容。

4. 邮件告知及脚本发送

  • 邮件设置
    • 确定邮件主题
    • 编写邮件正文
    • 指定附件:要将脚本代码本身作为附件发送,需要获取脚本文件的当前路径和文件名($(pwd)/$(basename $0)),并将其作为附件指定给邮件。

$(pwd)/$(basename $0)  

  • 构建出了当前脚本文件在文件系统中的完整路径及文件名
  • 例如,如果当前工作目录是 /home/user/scripts 且脚本文件名为 test.sh,那么 $(pwd)/$(basename $0) 就等于 /home/user/scripts/test.sh

pwd 

  • 获取当前工作目录路径

basename

  • 是一个用于获取路径中的文件名部分的命令
  • 基本用法是 basename   [路径],当给定一个完整的路径时,它会返回该路径中的文件名部分
    • 例如,对于路径 /home/user/Documents/test.sh,执行 basename /home/user/Documents/test.sh 会返回 test.sh
  • 如果只给定一个文件名(没有路径部分),它就直接返回该文件名本身

$0

  • 是一个特殊的变量,在 Shell 脚本中它代表当前正在执行的脚本文件本身的名称(包括扩展名,如果有的话)
    • 例如,如果你的脚本文件名为 test.sh,那么在脚本执行过程中,$0 的值就是 test.sh
  • 发送邮件:使用mails-nail命令来发送邮件,需要指定邮件主题、收件人邮箱地址以及附件等相关信息。

5.邮箱部署

#挂载
[root@localhost yangjunjie]# mount /dev/sr0 /mnt
#安装邮件服务、
[root@server ~]#dnf   install  s-nail  -y
#配置邮件服务
[root@localhost yangjunjie]# vim  /etc/s-nail.rc

a8c77b1214b14429ba1fb3b343545d51.png

#测试邮件服务
[root@localhost yangjunjie]# echo 邮件内容:我是作业 | mail -s 主题 xxxxxx@163.com

三、实验操作

关闭防火墙和SELinux
systemctl stop firewalld
setenforce 0

脚本代码

#!/bin/bash

# 接收用户输入的服务名称
read -p "请输入要部署的服务名称: " service_name

# 判断输入的服务名称是否为nginx
if [ "$service_name" != "nginx" ]; then
        echo "请输入正确的服务名称(nginx)"
        #终止脚本运行
        exit 1
fi

#################################################################
# which nginx &>/dev/null 判断 nginx 命令是否存在于系统路径中,若存在则表示已安装

. /root/task/fun.sh
if `which nginx &>/dev/null`; then
        echo "Nginx已安装"
        #调用函数
        nginx_service
        # 重启nginx服务
        systemctl restart nginx
else
        echo "Nginx未安装,接下来将开始安装nginx"
        # 使用 dnf 包管理器安装 nginx,静默安装,不输出详细信息到终端
        mount /dev/sr0 /mnt &> /dev/null
        dnf install nginx -y &> /dev/null
        if [ $? -eq 0 ];then
                # 如果安装成功,调用 nginx_service 函数进行进一步配置
                nginx_service
        else
                echo "nginx安装失败"
        fi
fi
#################################################################
#mail -s 邮件主题 或使用 s-nail
#mail -a 添加附件

#$(pwd)/$(basename $0)是一个用于获取当前脚本所在目录路径加上当前脚本文件名的表达式
#pwd——打印当前工作目录
#$0在 Bash 脚本中代表当前脚本的文件名(包括路径,如果在执行脚本时指定了路径)
#basename命令用于从给定的路径中提取文件名部分

attachment="$(pwd)/$(basename $0)"
echo "脚本代码——杨俊杰" | s-nail -s  "Linux练习作业" -a "$attachment"  xxxxx@163.com

对于配置 Nginx 服务的这一部分,写成函数,在脚本文件中直接进行调用

函数代码

nginx_service() {
        # 创建 Nginx 配置文件 /etc/nginx/conf.d/test.conf,并将以下内容写入其中
        cat <<EOF > /etc/nginx/conf.d/test.conf
server {
        listen 80;
        root /www;
}
EOF
        mkdir /www
        # 在 /www 目录下创建 index.html 文件,并写入内容
        echo this is test > /www/index.html

        # 重启 Nginx 服务
        systemctl restart nginx

        # 判断上一个命令(即重启 Nginx 服务)的退出状态码是否为 0
        #即判断nginx服务是否成功运行
        if [ $? -eq 0 ];then
                # 如果重启成功,使用 curl 命令访问本机的 IP 地址,即访问测试界面
                curl http://`hostname -I`
        else
                # 如果重启失败,输出提示信息并打印配置文件内容
                echo "服务启动失败"
                cat /etc/nginx/conf.d/test.conf
        fi
}

运行脚本

第二次运行脚本,显示文件以创建

 邮箱测试(自己的)

0a764964b08e4d0fba4e9285905c94d1.png

网页测试

7bce8e31764148fd875a7e79384416f6.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值