首页 > 系统相关 >shell脚本30个案例(三)

shell脚本30个案例(三)

时间:2024-11-20 13:15:27浏览次数:3  
标签:shell log 备份 30 server 案例 file 服务器 port

前言:

通过一个多月的shell学习,总共写出30个案例,分批次进行发布,这次总共发布了5个案例,希望能够对大家的学习和使用有所帮助,更多案例会在下期进行发布。

案例十一、监控服务器磁盘空间使用情况并在空间不足时发送邮件提醒

1.问题:

在服务器运行过程中,需要定期检查磁盘空间使用情况,当磁盘使用率超过某个阈值(例如 80%)时,自动向管理员发送邮件提醒,以便及时采取措施避免磁盘空间耗尽导致的问题。

2.分析:

要获取磁盘空间信息,可以使用df命令。它会显示文件系统的磁盘使用情况。

需要解析df命令输出的内容,提取出磁盘使用率的值。

通过mail或其他邮件发送工具(这里假设服务器已配置好邮件发送功能)向管理员发送邮件,邮件内容包含磁盘使用率过高的警告信息。

使用cron等定时任务工具来定期执行这个脚本。

3.流程图:

4.实现:

#!/bin/bash

# 阈值(这里设为 80%,可根据实际情况调整)
threshold=80

# 获取磁盘使用率(以根目录为例,可修改为其他需要监控的路径)
disk_usage=$(df -h / | tail -1 | awk '{print $5}' | tr -d '%')

if [ $disk_usage -gt $threshold ]; then
    subject="磁盘空间使用率过高警告"
    message="服务器磁盘空间使用率已达到 $disk_usage%,请及时检查。"
    echo $message | mail -s "$subject" [email protected]
fi

5.实现解析:

threshold=80:定义磁盘使用率的阈值,这里设为 80%。

disk_usage=$(df -h / | tail -1 | awk '{print $5}' | tr -d '%'):df -h /:使用df命令以可读的格式(-h选项)显示根目录(/)的磁盘使用情况。

tail -1:获取df输出的最后一行,这一行包含了根目录的汇总信息。

awk '{print $5}':从这一行中提取第 5 个字段,这里是磁盘使用率的值(包含%符号)。

tr -d '%':删除提取出的字符串中的%符号,得到一个纯数字的磁盘使用率。

if [ $disk_usage -gt $threshold ]; then...:判断磁盘使用率是否大于阈值。如果是,则执行以下操作:subject="磁盘空间使用率过高警告":定义邮件主题。

message="服务器磁盘空间使用率已达到 $disk_usage%,请及时检查。":构建邮件内容,包含当前磁盘使用率。

echo $message | mail -s "$subject" [email protected]:使用mail命令发送邮件,-s选项指定邮件主题,收件人为[email protected](这里需要根据实际管理员邮箱修改)。

6.结果验证:

手动调整磁盘使用率(可以通过向磁盘中写入大量临时文件模拟),使其超过设定的阈值(80%)。

案例十二、备份重要文件到远程服务器

1.问题:

有重要文件存储在本地服务器上,为防止数据丢失,需要每天将这些文件备份到远程备份服务器上,并且要记录备份的时间和结果。

2.分析:

需要确定要备份的文件或目录路径,可以通过变量指定。

使用scp命令将文件从本地服务器复制到远程服务器。scp命令基于 SSH 协议,因此需要确保本地和远程服务器之间的 SSH 连接正常且有相应权限。

获取当前时间,用于记录备份开始时间和结束时间,可使用date命令。

将备份的相关信息(如开始时间、结束时间、成功与否)记录到日志文件中。

3.流程图:

4.实现:

#!/bin/bash

# 本地要备份的文件或目录
local_files="/path/to/local/files"
# 远程服务器备份目录
remote_dir="[email protected]:/path/to/remote/backup"
# 日志文件路径
log_file="/var/log/backup.log"

# 获取备份开始时间
start_time=$(date +"%Y-%M-%d %H:%M:%S")

# 执行备份
scp -r $local_files $remote_dir

if [ $? -eq 0 ]; then
    end_time=$(date +"%Y-%M-%d %H:%M:%S")
    echo "备份成功。开始时间:$start_time,结束时间:$end_time" >> $log_file
else
    end_time=$(date +"%Y-%M-%d %H:%M:%S")
    echo "备份失败。开始时间:$start_time,结束时间:$end_time" >> $log_file
fi

5.实现解析:

local_files="/path/to/local/files"和remote_dir="user@backup_server:/path/to/remote/backup":分别指定本地要备份的文件或目录路径和远程服务器上的备份目录,这里的user@backup_server需要替换为实际的远程服务器用户名和地址。

log_file="/var/log/backup.log":指定备份日志文件的路径。

start_time=$(date +"%Y-%M-%d %H:%M:%S"):使用date命令并指定格式,获取当前时间作为备份开始时间。

scp -r $local_files $remote_dir:使用scp命令以递归(-r)的方式将本地文件复制到远程服务器。

if [ $? -eq 0 ]; then...:通过检查$?的值来判断scp命令是否执行成功。$?是上一个命令的退出状态码,0表示成功。如果成功,获取结束时间并将成功信息记录到日志文件中;如果失败,同样获取结束时间并记录失败信息。

6.结果验证

在本机创建目录

mkdir -p /path/to/local/files

在远程机创建目录

mkdir -p /path/to/remote/backup

在本机上面运行脚本,结果如下

输入密码之后,即备份成功,可以看到日志如下,在远程机上查看是否有该文件

可以看到文件备份成功了。

案例十三、自动备份数据库

1.问题:

需要定期对 MySQL 数据库进行备份,以防止数据丢失,并且希望通过一个 shell 脚本实现自动化备份操作,备份文件要按照日期进行命名以便于管理,同时记录备份的相关信息。

2.分析:

要备份 MySQL 数据库,需要使用 MySQL 提供的备份工具,如mysqldump命令,它可以将数据库的结构和数据导出为一个 SQL 文件。

需要获取当前日期,以便按照日期来命名备份文件,可通过date命令实现。

确定备份文件的存储路径,要确保该路径有足够的空间且脚本有写入权限。

为了记录备份的相关信息,如备份开始时间、结束时间、备份是否成功等,可将这些信息写入到一个日志文件中。

3.流程图:

4.实现:

#!/bin/bash

# MySQL数据库相关配置
db_user="root"
db_password="123456"
db_name="test"

# 备份文件存储路径
backup_path="/path/to/backup/directory"

# 日志文件路径
log_path="/path/to/log/directory/backup_log.log"

# 获取当前日期
current_date=$(date +"%Y%m%d")

# 构建备份文件名
backup_file="${backup_path}/${db_name}_${current_date}.sql"

# 记录备份开始时间
start_time=$(date +"%Y-%m-%d %H:%M:%S")
echo "备份开始时间:${start_time}" >> ${log_path}

# 使用 mysqldump 备份数据库
mysqldump -u ${db_user} -p${db_password} ${db_name} > ${backup_file}

# 判断备份是否成功
if [ $? -eq 0 ]; then
    end_time=$(date +"%Y-%m-%d %H:%M:%S")
    echo "备份成功。备份结束时间:${end_time}" >> ${log_path}
else
    end_time=$(date +"%Y-%m-%d %H:%M:%S")
    echo "备份失败。备份结束时间:${end_time}" >> ${log_path}
    exit 1
fi

5.实现解析:

db_user=""、db_password=""、db_name="":分别设置 MySQL 数据库的用户名、密码和要备份的数据库名称,需要根据实际情况进行替换。

backup_path="/path/to/backup/directory":指定备份文件的存储路径,确保该路径存在且脚本有写入权限。

log_path="/path/to/log/directory/backup_log.log":确定用于记录备份相关信息的日志文件路径,同样要保证该路径可写。

current_date=$(date +"%Y%m%d"):通过date命令获取当前日期,并按照%Y%m%d的格式(年、月、日)进行格式化,以便用于备份文件名的构建。

backup_file="${backup_path}/${db_name}_${current_date}.sql":根据数据库名称和当前日期构建备份文件名,格式为数据库名_日期.sql,存储在指定的备份路径下。

start_time=$(date +"%Y-%m-%d %H:%M:%S"):获取备份开始的时间,并将其记录到日志文件中,格式为年-月-日 时:分:秒。

mysqldump -u ${db_user} -p${db_password} ${db_name} > ${backup_file}:使用mysqldump命令备份数据库。-u选项指定用户名,-p选项后跟密码(注意这里密码和用户名之间没有空格),${db_name}是要备份的数据库名称,>操作符将备份结果输出到指定的备份文件中。

if [ $? -eq 0 ]; then...:通过检查$?的值来判断mysqldump命令是否执行成功。$?是上一个命令的退出状态码,0表示成功。如果成功,获取备份结束时间并记录成功信息到日志文件中;如果失败,获取备份结束时间并记录失败信息到日志文件中,同时通过exit 1退出脚本,表示备份失败。

6.结果验证:

成功运行结果如下

查看日志

案例十四、监控数据库连接数

1.问题:

在数据库服务器运行过程中,需要实时监控数据库的连接数。当连接数超过一定阈值时,能够及时发出警报(这里简单地将信息输出到日志文件),以便管理员采取措施,防止过多连接影响数据库性能。

2.分析:

需要使用数据库管理系统提供的命令或工具来获取连接数信息。

设定一个合理的连接数阈值,超过这个阈值就认为连接数过高。

将获取到的连接数与阈值进行比较。

使用日志文件来记录连接数信息和警报信息。

3.流程图:

4.实现:

#!/bin/bash

# MySQL数据库连接参数
user="root"
password="123456"
database="test"

# 连接数阈值
threshold=10

# 日志文件路径
log_file="db_connection_monitor.log"

# 使用 mysql 命令获取连接数
connection_count=$(mysql -u$user -p$password $database -e "SHOW STATUS LIKE 'Threads_connected';" | awk '{print $2}' | tail -n 1)

if [ $connection_count -le $threshold ]; then
    echo "当前数据库连接数: $connection_count" >> $log_file
else
    echo "警报: 数据库连接数 ($connection_count) 超过阈值 ($threshold)!" >> $log_file
fi

5.实现解析:

user=""、password=""、database="e":这些是连接 MySQL 数据库的参数,需要根据实际情况替换。

threshold=10:设定连接数的阈值,这里设为 10,可根据数据库服务器的性能和实际使用情况调整。

log_file="db_connection_monitor.log":指定用于记录连接数信息和警报信息的日志文件路径。

connection_count=$(mysql -u$user -p$password $database -e "SHOW STATUS LIKE 'Threads_connected';" | awk '{print $2}' | tail -n 1):使用mysql命令连接到指定的数据库,执行SHOW STATUS LIKE 'Threads_connected';语句来获取连接数信息。

通过awk '{print $2}'提取输出结果中的第二列(即连接数的值),tail -n 1取最后一行。

if [ $connection_count -le $threshold ]; then...:判断获取到的连接数是否小于等于阈值。如果是,则将当前连接数记录到日志文件中;如果超过阈值,则记录警报信息到日志文件中。

6.结果验证:

将阈值设置成10,执行脚本

可以看到当前连接数只有1个,将阈值设置成0,再次运行脚本

可以看到这里进行了警告,连接数超过了0,在实际运用中可以按需进行阈值的修改。

案例十五、批量检测服务器上指定端口是否开放

1.问题:

在一个服务器集群环境中,需要经常检查特定服务所使用的端口是否正常开放,手动逐个检查服务器和端口效率低下。因此,需要一个脚本来批量检测多个服务器上的指定端口是否开放,以便及时发现端口异常关闭等问题,保障服务的正常运行。

2.分析:

确定要检测的服务器列表和端口列表:可以将服务器 IP 地址和要检测的端口号存储在文件中,每行可以是“IP 地址:端口号”的格式。

选择检测端口的方法:使用nc(netcat)命令可以尝试连接指定的端口,如果连接成功,则端口开放;如果连接失败,则端口可能关闭或被防火墙阻止等。

记录检测结果:将每个服务器的 IP 地址、端口号以及检测结果(开放或关闭)记录到一个日志文件中,方便查看和分析。

处理可能的超时问题:连接端口时可能会出现长时间无响应的情况,需要设置合适的超时时间,避免脚本长时间阻塞。

3.流程图:

4.实现:

#!/bin/bash

# 服务器和端口信息文件路径
server_port_file="server_ports.txt"
# 日志文件路径
log_file="port_check.log"

# 检测端口的函数
check_port() {
    server_port=$1
    server=$(echo $server_port | cut -d ':' -f 1)
    port=$(echo $server_port | cut -d ':' -f 2)
    # 使用 nc 命令检测端口,设置超时时间为 3 秒
    if timeout 3 bash -c "</dev/tcp/$server/$port"; then
        echo "$server:$port - 开放" >> $log_file
    else
        echo "$server:$port - 关闭" >> $log_file
    fi
}

# 主程序
if [ -f $server_port_file ]; then
    > $log_file
    while read server_port; do
        check_port $server_port
    done < $server_port_file
else
    echo "服务器和端口信息文件未找到。"
    exit 1
fi

5.实现解析:

server_port_file="server_ports.txt"和log_file="port_check.log":分别指定存储服务器和端口信息的文件路径以及记录检测结果的日志文件路径。

check_port() {... }:这是一个自定义函数,用于检测单个服务器的指定端口。server_port=$1:函数接收一个参数,即服务器和端口信息(格式为“IP 地址:端口号”)。

server=$(echo $server_port | cut -d ':' -f 1)和port=$(echo $server_port | cut -d ':' -f 2):从参数中提取服务器 IP 地址和端口号。

if timeout 3 bash -c "</dev/tcp/$server/$port"; then...:使用timeout命令设置 3 秒的超时时间,然后通过bash -c "</dev/tcp/$server/$port"尝试连接指定服务器的指定端口。如果连接成功(即timeout命令正常退出),则表示端口开放,将相应信息记录到日志文件;如果连接失败(timeout命令超时退出或因其他原因退出),则表示端口关闭,记录相应信息。

if [ -f $server_port_file ]; then...:这是主程序部分,首先检查服务器和端口信息文件是否存在。> $log_file:如果文件存在,先清空日志文件内容。

while read server_port; do... done < $server_port_file:通过循环逐行读取服务器和端口信息文件中的内容,并调用check_port函数检测每个服务器的指定端口。

如果服务器和端口信息文件不存在,则输出提示信息并以退出状态码 1 退出脚本。

6.结果验证:

首先创建server_ports.txt文件,否则就会输出如下结果

创建完毕之后就可以修改该文件,添加格式为【ip:端口】,在执行脚本

可以看到该服务器的80端口是开放的,将80端口改为8080,再次执行脚本

 可以看到该端口是关闭的。

标签:shell,log,备份,30,server,案例,file,服务器,port
From: https://blog.csdn.net/2401_82737195/article/details/143908437

相关文章

  • 【漏洞复现】CVE-2023-45852 Viessmann Vitogate 300命令执行漏洞
    漏洞描述CVE(CAN)ID:CVE-2023-45852ViessmannVitogate是Viessmann公司的一个智能化控制系统。ViessmannVitogate3002.1.3.0之前版本存在命令注入漏洞,未经身份认证的攻击者可利用该漏洞绕过身份认证并通过shell元字符执行任意命令。免责声明技术文章仅供参考,任何......
  • 关于在写一个查询模版es案例时踩的坑!
    背景:Elasticsearch的查询模板(SearchTemplate)功能非常强大,可以让你参数化复杂的查询,从而在不同的上下文中重用相同的查询逻辑。以下是一个从Elasticsearch官方文档中提取的查询模板案例,涵盖了如何创建和使用查询模板。目前项目采用的es版本:Elasticsearch6.8.61.创建......
  • 鸿蒙NEXT开发案例:随机密码生成
     【引言】本案例将实现一个随机密码生成器。用户可以自定义密码的长度以及包含的字符类型(大写字母、小写字母、数字、特殊字符),最后通过点击按钮生成密码,并提供一键复制功能。【环境准备】•操作系统:Windows10•开发工具:DevEcoStudioNEXTBeta1BuildVersion:5.0.3.806......
  • 【网络系统管理】Centos7——配置主从mariadb服务器案例
    目录一、配置yum源和修改主机名1、搭建yum源2、修改主机名二、安装mariadb服务器和基础工作1、安装服务2、开启服务3、关闭防火墙三、配置主mariadb服务器1、初始化2、编辑数据库集群节点3、登录数据库开放权限1、给予权限2、先去DBMS1查看信息3、添加MASTER信息......
  • P10304 [THUWC 2020] 道路修建
    注意到\(1\)到一个\(b\)子树内的点\(x\)的路径可以拆成\(1\top\toq\tox\)的形式,其中\(1\top\)走树边,\(p\toq\)为在点\(p\)从树边走出去,在点\(q\)走回来,然后\(q\)再走树边走到\(x\)。考虑\(f_i\)为最小的\(d\),满足断掉\(i\)深度为\(d\)的祖先到\(i......
  • 类和对象案例
    第一道1.先写一个手机类,将属性和行为全部写完2,再写一个手机测试类,将其成员变量赋值并不是只有测试类才能写main,其他类也可以有main,只不过代码会很臃肿,测试就用测试,不要把main写在其他类里总览第二道1.先写一个书类2.再写一个书测试类,将其成员变量赋值总览提供......
  • CSC3050 Project 3: RISC-V Simulator
    CSC3050Project3:RISC-VSimulatorwithRVV1BackgroundRISC-V,anopenstandardinstructionsetarchitecture(ISA),hasrapidlybecomeapivotalforceinacademicresearchandindustrialdevelopmentduetoitsflexibilityandopen-sourcenature.Unlikep......
  • 使用SSM框架实现Pet表的增删改查功能效果案例
    1.查询功能@RequestMapping("/index")publicStringindex(Modelmodel){List<Pet>petList=petService.findPetList();model.addAttribute("petList",petList);return"index";}2.修改功能@Re......
  • 使用java程序模拟电影案例(增删改查)
    publicstaticvoidmain(String[]args){//完成电影案例//1、创建电影对象:定义电影类//2、创建一个电影操作对象:专门负责对电影数据进行业务处理(上架、下架、查询、封杀)MovieServicemovieService=newMovieService();movi......
  • 20222303 2024-2025-1 《网络与系统攻防技术》实验五实验报告
    1.实验内容对网站进行DNS域名查询,包括注册人、IP地址等信息,还通过相关命令查询IP地址注册人及地理位置。尝试获取QQ好友IP地址并查询其地理位置。使用nmap对靶机环境扫描,获取靶机IP活跃状态、开放端口、操作系统版本、安装服务等信息。使用Nessus对靶机环境扫......