添加 z.ai/ftp_backup.sh
This commit is contained in:
@@ -0,0 +1,156 @@
|
||||
#!/bin/bash
|
||||
|
||||
# ==============================================================================
|
||||
# 脚本名称: ftp_backup.sh
|
||||
# 功能描述: 将指定的一个或多个目录打包压缩后,自动上传到FTP服务器。
|
||||
# 调用方式: ./ftp_backup.sh 目录1 [目录2] [目录3] ...
|
||||
# 作者: AI Assistant
|
||||
# 版本: 1.1
|
||||
# ==============================================================================
|
||||
|
||||
# --- 配置区 (请在此处修改您的FTP服务器信息) ---
|
||||
|
||||
# FTP服务器信息
|
||||
FTP_HOST="your_ftp_server_ip" # FTP服务器IP地址或域名
|
||||
FTP_PORT="21" # FTP服务器端口 (默认为21)
|
||||
FTP_USER="your_username" # FTP登录用户名
|
||||
FTP_PASS="your_password" # FTP登录密码
|
||||
|
||||
# 上传到FTP服务器的哪个目录 (如果不存在,请确保FTP账户有创建权限,或手动创建)
|
||||
FTP_REMOTE_DIR="/backup"
|
||||
|
||||
# 本地临时目录,用于存放生成的压缩包 (通常使用/tmp)
|
||||
TEMP_BACKUP_DIR="/tmp"
|
||||
|
||||
# --- 配置区结束 ---
|
||||
|
||||
|
||||
# --- 脚本主逻辑 (通常无需修改以下内容) ---
|
||||
|
||||
# 开启严格模式:遇到错误立即退出,使用未定义变量时报错,管道中任一命令失败则整个管道失败
|
||||
set -euo pipefail
|
||||
|
||||
# 定义一个清理函数,用于在脚本退出时删除临时文件
|
||||
cleanup() {
|
||||
if [[ -n "${ARCHIVE_NAME:-}" && -f "${TEMP_BACKUP_DIR}/${ARCHIVE_NAME}" ]]; then
|
||||
echo "清理临时文件: ${TEMP_BACKUP_DIR}/${ARCHIVE_NAME}"
|
||||
rm -f "${TEMP_BACKUP_DIR}/${ARCHIVE_NAME}"
|
||||
fi
|
||||
}
|
||||
|
||||
# 无论脚本如何退出(成功、失败、被中断),都会执行cleanup函数
|
||||
trap cleanup EXIT
|
||||
|
||||
# 显示使用方法
|
||||
usage() {
|
||||
echo "用法: $0 目录1 [目录2] [目录3] ..."
|
||||
echo "示例: $0 /var/www/html /etc/nginx /home/user/documents"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# 检查并安装ftp客户端
|
||||
check_dependencies() {
|
||||
echo "正在检查 ftp 客户端是否已安装..."
|
||||
if ! command -v ftp &> /dev/null; then
|
||||
echo "ftp 客户端未找到,正在尝试自动安装..."
|
||||
# 检测操作系统类型
|
||||
if [[ -f /etc/debian_version ]]; then
|
||||
# Debian/Ubuntu 系统
|
||||
echo "检测到 Debian/Ubuntu 系统,使用 apt-get 安装..."
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y ftp
|
||||
elif [[ -f /etc/redhat-release ]]; then
|
||||
# CentOS/RHEL/Fedora 系统
|
||||
echo "检测到 RedHat/CentOS 系统,使用 yum 安装..."
|
||||
sudo yum install -y ftp
|
||||
else
|
||||
echo "错误: 无法识别您的Linux发行版,请手动安装 ftp 客户端。"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 再次检查是否安装成功
|
||||
if ! command -v ftp &> /dev/null; then
|
||||
echo "错误: ftp 客户端安装失败!"
|
||||
exit 1
|
||||
fi
|
||||
echo "ftp 客户端安装成功。"
|
||||
else
|
||||
echo "ftp 客户端已安装。"
|
||||
fi
|
||||
}
|
||||
|
||||
# 创建压缩包
|
||||
create_archive() {
|
||||
local dirs_to_backup=("$@")
|
||||
# 生成唯一的压缩包名:主机名_时间戳.tar.gz
|
||||
ARCHIVE_NAME="backup_$(hostname)_$(date +%Y%m%d_%H%M%S).tar.gz"
|
||||
local full_archive_path="${TEMP_BACKUP_DIR}/${ARCHIVE_NAME}"
|
||||
|
||||
echo "正在创建压缩包: ${full_archive_path}"
|
||||
echo "包含的目录: ${dirs_to_backup[*]}"
|
||||
|
||||
# 使用 tar 命令创建 .tar.gz 压缩包
|
||||
# -c: 创建, -z: gzip压缩, -f: 指定文件名, -p: 保留权限
|
||||
tar -czpf "${full_archive_path}" "${dirs_to_backup[@]}"
|
||||
|
||||
echo "压缩包创建成功!"
|
||||
}
|
||||
|
||||
# 上传到FTP服务器
|
||||
upload_to_ftp() {
|
||||
local local_file="${TEMP_BACKUP_DIR}/${1}"
|
||||
echo "正在上传 ${local_file} 到 FTP 服务器 ${FTP_HOST}:${FTP_PORT}${FTP_REMOTE_DIR}"
|
||||
|
||||
# 使用 ftp 的 -inv 选项进行非交互式上传
|
||||
# -i: 关闭交互式提示
|
||||
# -n: 禁止自动登录
|
||||
# -v: 显示详细输出
|
||||
ftp -inv << EOF
|
||||
open ${FTP_HOST} ${FTP_PORT}
|
||||
user ${FTP_USER} ${FTP_PASS}
|
||||
binary
|
||||
mkdir ${FTP_REMOTE_DIR}
|
||||
cd ${FTP_REMOTE_DIR}
|
||||
put ${local_file} ${1}
|
||||
bye
|
||||
EOF
|
||||
|
||||
echo "文件上传成功!"
|
||||
}
|
||||
|
||||
|
||||
# ==============================================================================
|
||||
# 主程序入口
|
||||
# ==============================================================================
|
||||
|
||||
# 1. 检查是否提供了目录参数
|
||||
if [ "$#" -eq 0 ]; then
|
||||
usage
|
||||
fi
|
||||
|
||||
# 2. 验证所有提供的目录是否存在
|
||||
echo "正在验证输入的目录..."
|
||||
for dir in "$@"; do
|
||||
if [ ! -d "$dir" ]; then
|
||||
echo "错误: 目录 '$dir' 不存在!"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
echo "所有目录验证通过。"
|
||||
|
||||
# 3. 检查并安装依赖
|
||||
check_dependencies
|
||||
|
||||
# 4. 创建压缩包
|
||||
create_archive "$@"
|
||||
|
||||
# 5. 上传压缩包
|
||||
upload_to_ftp "${ARCHIVE_NAME}"
|
||||
|
||||
# 6. 脚本执行完毕
|
||||
echo "========================================="
|
||||
echo "备份任务全部完成!"
|
||||
echo "备份文件: ${ARCHIVE_NAME}"
|
||||
echo "========================================="
|
||||
|
||||
exit 0
|
||||
Reference in New Issue
Block a user