当前位置: 首页 > article >正文

常用Shell脚本总结

文章目录

  • 常用Shell脚本总结
      • 1. 文件备份脚本
      • 2. 监控磁盘使用率
      • 3. 批量重命名文件
      • 4. 服务状态检查
      • 5. 日志文件清理
      • 6. 自动登录SSH并执行命令
      • 7. 监控CPU和内存使用情况
      • 8. 定时拉取Git仓库更新
      • 9. 网络连通性测试
      • 10. 生成随机密码
      • 11. 批量终止指定进程
      • 12. 监控用户登录并通知
      • 13. 自动同步两个目录
      • 14. 生成系统信息报告
      • 15. 批量下载文件列表
      • 16. 自动更新SSL证书
      • 17. 检测开放端口
      • 18. 批量修改文件权限
      • 19. 监控新安装的软件包
      • 20. 数据库自动备份
      • 使用说明
      • 使用建议

常用Shell脚本总结

以下是一些常用的Shell脚本示例,涵盖文件操作、系统监控、自动化任务、进程管理、用户监控、数据同步等场景,适合学习和快速使用:


1. 文件备份脚本

#!/bin/bash
# 功能:将指定目录打包压缩并备份到目标路径

src_dir="/path/to/source"    # 源目录
backup_dir="/path/to/backup" # 备份目录
date=$(date +%Y%m%d)         # 当前日期
backup_file="backup_${date}.tar.gz"

# 检查备份目录是否存在
if [ ! -d "$backup_dir" ]; then
  mkdir -p "$backup_dir"
fi

# 执行备份
tar -czf "${backup_dir}/${backup_file}" "$src_dir" && \
echo "备份成功: ${backup_file}" || \
echo "备份失败!"

2. 监控磁盘使用率

#!/bin/bash
# 功能:检查磁盘使用率,超过阈值时发送告警

threshold=80  # 设置阈值(百分比)
partition="/dev/sda1"

usage=$(df -h | grep "$partition" | awk '{print $5}' | cut -d'%' -f1)

if [ "$usage" -gt "$threshold" ]; then
  echo "警告:磁盘分区 $partition 使用率 ${usage}%!" | mail -s "磁盘告警" admin@example.com
fi

3. 批量重命名文件

#!/bin/bash
# 功能:将目录下所有.txt文件后缀改为.md

for file in *.txt; do
  new_name="${file%.txt}.md"  # 去除旧后缀,添加新后缀
  mv "$file" "$new_name"
  echo "已重命名: $file$new_name"
done

4. 服务状态检查

#!/bin/bash
# 功能:检查Nginx服务是否运行,若未运行则自动启动

service_name="nginx"

if systemctl is-active --quiet "$service_name"; then
  echo "$service_name 正在运行"
else
  echo "$service_name 未运行,尝试启动..."
  systemctl start "$service_name"
fi

5. 日志文件清理

#!/bin/bash
# 功能:删除超过30天的日志文件

log_dir="/var/log/myapp"
days_to_keep=30

find "$log_dir" -name "*.log" -type f -mtime +$days_to_keep -exec rm -f {} \;
echo "已清理超过 ${days_to_keep} 天的日志文件"

6. 自动登录SSH并执行命令

#!/bin/bash
# 功能:自动登录远程服务器并执行命令

remote_user="user"
remote_host="example.com"
command_to_run="uptime"

ssh "${remote_user}@${remote_host}" "$command_to_run"

7. 监控CPU和内存使用情况

#!/bin/bash
# 功能:输出当前CPU和内存使用率

cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
mem_usage=$(free -m | awk '/Mem/{printf "%.2f%%", $3/$2*100}')

echo "CPU使用率: ${cpu_usage}%"
echo "内存使用率: ${mem_usage}"

8. 定时拉取Git仓库更新

#!/bin/bash
# 功能:定时拉取Git仓库最新代码(可添加到cron任务)

repo_dir="/path/to/git/repo"

cd "$repo_dir" || exit
git pull origin main
echo "代码已更新:$(date)"

9. 网络连通性测试

#!/bin/bash
# 功能:测试到指定主机的网络连通性

target_host="8.8.8.8"  # 以Google DNS为例

ping -c 4 "$target_host" > /dev/null 2>&1
if [ $? -eq 0 ]; then
  echo "网络连接正常"
else
  echo "网络连接失败!"
fi

10. 生成随机密码

#!/bin/bash
# 功能:生成一个12位随机密码(含大小写字母、数字、符号)

password=$(tr -dc 'A-Za-z0-9!@#$%^&*()' < /dev/urandom | head -c 12)
echo "随机密码: $password"

11. 批量终止指定进程

#!/bin/bash
# 功能:根据进程名批量终止进程(支持模糊匹配)
process_name="java"  # 例如终止所有Java进程

pids=$(pgrep -f "$process_name")
if [ -z "$pids" ]; then
  echo "未找到进程: $process_name"
else
  kill -15 $pids 2>/dev/null && echo "已终止进程: $pids" || echo "终止失败"
fi

12. 监控用户登录并通知

#!/bin/bash
# 功能:当特定用户登录时发送邮件通知
target_user="admin"  # 监控的用户名

if who | grep -q "^$target_user "; then
  echo "用户 $target_user 已登录服务器 $(hostname)" | mail -s "登录警报" admin@example.com
fi

13. 自动同步两个目录

#!/bin/bash
# 功能:使用 rsync 增量同步目录(本地或远程)
source_dir="/path/to/source/"
dest_dir="user@remote:/path/to/destination/"

rsync -avz --delete "$source_dir" "$dest_dir" && \
echo "同步完成" || \
echo "同步失败!检查网络或权限。"

14. 生成系统信息报告

#!/bin/bash
# 功能:输出系统关键信息到日志文件
report_file="/var/log/system_report_$(date +%Y%m%d).txt"

{
  echo "===== 系统信息报告 ====="
  echo "主机名: $(hostname)"
  echo "系统版本: $(uname -a)"
  echo "磁盘使用:"
  df -h
  echo "内存使用:"
  free -m
} > "$report_file"
echo "报告已生成: $report_file"

15. 批量下载文件列表

#!/bin/bash
# 功能:从文本文件中读取URL列表并批量下载
url_list="download_list.txt"  # 每行一个URL
download_dir="~/downloads"

mkdir -p "$download_dir"
while IFS= read -r url; do
  wget -q -P "$download_dir" "$url" && echo "下载成功: $url" || echo "失败: $url"
done < "$url_list"

16. 自动更新SSL证书

#!/bin/bash
# 功能:检查证书过期时间并自动续签(需配合Certbot)
domain="example.com"
cert_path="/etc/letsencrypt/live/$domain/fullchain.pem"

expiry_date=$(openssl x509 -enddate -noout -in "$cert_path" | cut -d= -f2)
days_left=$(( ( $(date -d "$expiry_date" +%s) - $(date +%s) ) / 86400 ))

if [ "$days_left" -lt 7 ]; then
  certbot renew --quiet && systemctl reload nginx
  echo "证书已更新"
else
  echo "证书有效(剩余天数: $days_left)"
fi

17. 检测开放端口

#!/bin/bash
# 功能:扫描指定主机的常用端口是否开放
target_host="example.com"
ports="80 443 22 3306"  # 自定义端口列表

for port in $ports; do
  nc -zvw3 "$target_host" "$port" &>/dev/null && \
  echo "端口 $port 开放" || \
  echo "端口 $port 关闭"
done

18. 批量修改文件权限

#!/bin/bash
# 功能:递归修改目录下所有文件的权限
target_dir="/path/to/files"
new_permission="644"  # 文件权限
dir_permission="755"  # 目录权限

find "$target_dir" -type f -exec chmod $new_permission {} \;
find "$target_dir" -type d -exec chmod $dir_permission {} \;
echo "权限修改完成"

19. 监控新安装的软件包

#!/bin/bash
# 功能:检测最近24小时内安装的软件包
if [ -f /var/log/dpkg.log ]; then
  echo "最近安装的软件包:"
  grep "install " /var/log/dpkg.log | \
  awk '{if (NR>=1 && $1 >= "'$(date -d "24 hours ago" "+%Y-%m-%d")'") print $4}'
else
  echo "未找到软件包日志"
fi

20. 数据库自动备份

#!/bin/bash
# 功能:备份MySQL数据库并压缩
db_user="root"
db_pass="your_password"
db_name="mydatabase"
backup_dir="/backup/mysql"
backup_file="${db_name}_$(date +%Y%m%d).sql.gz"

mkdir -p "$backup_dir"
mysqldump -u"$db_user" -p"$db_pass" "$db_name" | gzip > "${backup_dir}/${backup_file}"
echo "数据库已备份: ${backup_file}"

使用说明

  1. 将代码保存为 .sh 文件(如 backup.sh);
  2. 赋予执行权限:chmod +x script.sh
  3. 执行脚本:./script.sh
  4. 定时任务可通过 crontab -e 添加(如每天备份)。

使用建议

  1. 权限管理:涉及系统操作的脚本建议使用 sudo 或在脚本内添加权限检查。
  2. 安全性:包含密码的脚本(如数据库备份)应设置 600 权限,避免敏感信息泄露。
  3. 日志记录:可在脚本中添加 >> /var/log/script.log 记录执行结果。
  4. 定时任务:结合 crontab -e 实现自动化(例如每小时监控一次磁盘)。

示例定时任务(每天凌晨备份数据库):

0 0 * * * /path/to/script/mysql_backup.sh >/dev/null 2>&1

注意事项:

  • 谨慎使用 rm 删除操作,尤其是 rm -rf
  • 涉及系统级操作时,建议先测试或添加权限验证。
  • 脚本中的路径需根据实际环境修改。

http://www.kler.cn/a/577012.html

相关文章:

  • SQL Server核心知识总结
  • C# 异步任务队列封装
  • RocketMQ提供了哪些过滤机制?
  • OpenSSL 使用方法汇总:从证书管理到加密解密全解析
  • 【从0到1构建实时聊天系统:Spring Boot + Vue3 + WebSocket全栈实战】
  • leetcode日记(86)恢复二叉搜索树
  • 无线电家电遥控系统的设计(论文+源码)
  • pyside6学习专栏(十一):在PySide6中实现一简易的画板程序
  • 备赛蓝桥杯之第十五届职业院校组省赛第六题:简易JSX解析器
  • Unity Shader编程】之基础纹理
  • ESP8266 NodeMCU 与 Atmega16 微控制器连接以发送电子邮件
  • 【linux网络编程】套接字socket
  • 迷宫【BFS+结构体\pair】
  • 力扣每日一题——2597. 美丽子集的数目
  • HarmonyOS Next 属性动画和转场动画
  • 【算法 C/C++】一维前缀和
  • 面试过了,总结测试工程师面试题(含答案)
  • Github 2025-03-08Rust开源项目日报Top10
  • 【JAVA架构师成长之路】【Redis】第15集:Redis大Key问题分析与解决方案
  • FPGA学习篇——Verilog学习5(reg,wire区分及模块例化)