返回

SHELL 脚本指南:增强系统管理和自动化任务

后端

引言

Shell 脚本作为一种强大的工具,可以极大提升系统管理和自动化任务的效率。我们整理了九个实用的 shell 脚本示例,涵盖了从系统维护到日常任务自动化的方方面面,帮助你打造更高效、更智能的工作流程。

1. Dos 攻击防范(自动屏蔽攻击 IP)

#!/bin/bash

# 获取当前时间戳
timestamp=$(date +%s)

# 读取被攻击 IP 地址列表
attacking_ips=$(grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort -u)

# 封禁攻击 IP
for ip in $attacking_ips; do
  iptables -A INPUT -s $ip -j DROP
  echo "$ip 已被封禁至 $timestamp" >> /var/log/blocked_ips.log
done

2. Linux 系统发送告警脚本

#!/bin/bash

# 定义告警等级
warning_level=$1

# 定义告警内容
alert_message=$2

# 定义告警接收人邮箱
recipient_email=$3

# 发送告警邮件
echo "$alert_message" | mail -s "系统告警 - 级别: $warning_level" $recipient_email

3. MySQL 数据库备份单循环

#!/bin/bash

# 定义备份文件名
backup_file="db_backup_$(date +%Y%m%d).sql"

# 定义数据库名称
database_name="my_database"

# 定义 MySQL 用户名和密码
mysql_user="root"
mysql_password="password"

# 执行数据库备份
mysqldump -u $mysql_user -p$mysql_password $database_name > $backup_file

4. MySQL 数据库备份多循环

#!/bin/bash

# 定义备份目录
backup_dir="/var/backups/mysql"

# 定义数据库列表
databases=("db1" "db2" "db3")

# 定义 MySQL 用户名和密码
mysql_user="root"
mysql_password="password"

# 创建备份目录
mkdir -p $backup_dir

# 循环备份每个数据库
for database in ${databases[@]}; do
  backup_file="$backup_dir/$database.sql"
  mysqldump -u $mysql_user -p$mysql_password $database > $backup_file
done

5. Nginx 访问日志按天切割

#!/bin/bash

# 定义日志文件路径
log_file="/var/log/nginx/access.log"

# 定义切割后的日志文件目录
rotated_logs_dir="/var/log/nginx/rotated"

# 定义切割频率(天)
rotation_interval=1

# 创建切割后的日志文件目录
mkdir -p $rotated_logs_dir

# 执行日志切割
find $log_file -mtime +$rotation_interval -exec mv {} $rotated_logs_dir \;

6. Nginx 访问日志按大小切割

#!/bin/bash

# 定义日志文件路径
log_file="/var/log/nginx/access.log"

# 定义切割后的日志文件目录
rotated_logs_dir="/var/log/nginx/rotated"

# 定义切割大小(MB)
rotation_size=10

# 创建切割后的日志文件目录
mkdir -p $rotated_logs_dir

# 执行日志切割
logrotate -f -s $log_file $rotated_logs_dir/access.log.$rotation_size.gz

7. Apache 日志切割

#!/bin/bash

# 定义日志文件路径
log_file="/var/log/apache2/access.log"

# 定义切割后的日志文件目录
rotated_logs_dir="/var/log/apache2/rotated"

# 定义切割频率(天)
rotation_interval=1

# 创建切割后的日志文件目录
mkdir -p $rotated_logs_dir

# 执行日志切割
find $log_file -mtime +$rotation_interval -exec mv {} $rotated_logs_dir \;

8. 自动清理旧备份脚本

#!/bin/bash

# 定义备份目录
backup_dir="/var/backups"

# 定义保留备份数量
retention_count=5

# 获取备份文件列表
backup_files=$(find $backup_dir -type f -name "*.gz" | sort -r)

# 删除多余的备份文件
for backup_file in $backup_files; do
  if [[ $((${#backup_files[@]} - $retention_count)) -gt 0 ]]; then
    rm $backup_file
  fi
done

9. 发送电子邮件脚本

#!/bin/bash

# 定义邮件服务器地址
smtp_server="smtp.example.com"

# 定义发件人邮箱地址
sender_email="sender@example.com"

# 定义收件人邮箱地址
recipient_email="recipient@example.com"

# 定义邮件主题
subject="Important Message"

# 定义邮件正文
body="This is an important message."

# 发送邮件
echo "$body" | mail -s "$subject" -S smtp="$smtp_server" -f "$sender_email" "$recipient_email"