diff --git a/z.ai/ftp_backup.sh b/z.ai/ftp_backup.sh new file mode 100644 index 0000000..c5b618b --- /dev/null +++ b/z.ai/ftp_backup.sh @@ -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 \ No newline at end of file