[收藏本帖] [分享]

添加liunxFtp上传到其他主机的脚本

时间:2026-09-18 19:24 作者:392资源网 浏览:203

一.在 Linux 本机安装 lftp

    # CentOS / RHEL

    yum install lftp -y

    

    # Debian / Ubuntu

    apt update && apt install lftp -y

二.创建配置文件 /etc/backup_ftp.conf:

    vi /etc/backup_ftp.conf

    

    1.确认要写入的内容

        FTP_HOST=你的Windows_IP

        FTP_USER=backup_user

        FTP_PASS=你的密码

        FTP_PORT=21

        DING_WEBHOOK=https://oapi.dingtalk.com/robot/send?access_token=你的token

        DING_KEYWORD=宝塔面板

        DING_TITLE=备份异常

        

        使用 vi 的操作流程:

            进入插入模式

            按一下键盘字母 i(左下角出现 -- INSERT -- 表示可以输入/粘贴)。

            

            粘贴内容

            直接把上面 4 行内容复制(Ctrl+C),然后到终端里右键 → 粘贴,或者 Shift+Insert 粘贴。

            终端里会显示刚才的四行内容。

            

            退出插入模式

            按一下键盘 Esc 键(左下角 -- INSERT -- 消失)。

            

            保存并退出

            输入英文冒号 :,再输入 wq,然后回车。

            完整命令是 :wq → 回车。

            文件保存成功后会回到命令提示符。

            

            如果想放弃编辑,按 Esc 后输入 :q! 回车。

            

    2.设置文件权限(重要)

        chmod 600 /etc/backup_ftp.conf

        

    3.检查文件是否写入成功

        cat /etc/backup_ftp.conf

三.备份脚本:

    #!/bin/bash

    

    source /etc/backup_ftp.conf

    

    SRC1="/www/backup/database/mysql/crontab_backup/www_itingshu_net"

    DST1="/mysql/www_itingshu_net"      

    

    SRC2="/www/backup/site/api.itingshu.iiisss.top"

    DST2="/site/www_itingshu_net"

    

    LOGFILE="/var/log/backup_to_win.log"

    LOCKFILE="/var/run/backup_to_win.lock"

    

    # ---- 每月清空一次日志 ----

    THIS_MONTH=$(date +%Y%m)

    LAST_CLEAN_FILE="/var/run/backup_to_win.clean_date"

    

    if [ -f "$LAST_CLEAN_FILE" ]; then

        LAST_MONTH=$(cat "$LAST_CLEAN_FILE")

    else

        LAST_MONTH="none"

    fi

    

    if [ "$THIS_MONTH" != "$LAST_MONTH" ]; then

        : > "$LOGFILE"

        echo "$THIS_MONTH" > "$LAST_CLEAN_FILE"

    fi

    

    exec 200>"$LOCKFILE"

    flock -n 200 || {

        echo "$(date '+%F %T') - 备份任务已在运行,跳过。" | tee -a "$LOGFILE"

        exit 1

    }

    

    # 钉钉通知函数

    ding_talk() {

        local message="$1"

        local title="${2:-${DING_TITLE}}"

        local full_title="${DING_KEYWORD}${title}"

        curl -s -X POST "$DING_WEBHOOK" \

            -H "Content-Type: application/json" \

            -d '{"msgtype":"actionCard","actionCard":{"title":"'"${full_title}"'","text":"'"${message}"'"}}' >/dev/null 2>&1

    }

    

    echo "$(date '+%F %T') - 开始 FTP 每日备份(仅上传最新 .sql.gz / .tar.gz)..." | tee -a "$LOGFILE"

    

    # 上传每个本地目录中最新的一个符合条件的文件

    upload_latest() {

        local local_dir="$1"

        local remote_dir="$2"

    

        echo "[$(date '+%F %T')] 正在处理: $local_dir" | tee -a "$LOGFILE"

    

        # 找出最新的 .sql.gz 或 .tar.gz 文件(按修改时间倒序,取第一个)

        local latest_file

        latest_file=$(find "$local_dir" -maxdepth 1 -type f \( -name "*.sql.gz" -o -name "*.tar.gz" \) -printf "%T@ %p\n" 2>/dev/null | sort -rn | head -1 | awk '{print $2}')

    

        if [ -z "$latest_file" ]; then

            echo "[$(date '+%F %T')] 未找到 .sql.gz 或 .tar.gz 文件,跳过: $local_dir" | tee -a "$LOGFILE"

            return 0   # 不视作失败

        fi

    

        local fname

        fname=$(basename "$latest_file")

    

        echo "[$(date '+%F %T')] 准备上传: $fname -> $remote_dir/" | tee -a "$LOGFILE"

    

        lftp -u "$FTP_USER","$FTP_PASS" -p "$FTP_PORT" "$FTP_HOST" <&1 | tee -a "$LOGFILE"

        set ftp:ssl-allow no

        mkdir -p "$remote_dir"

        put "$latest_file" -o "$remote_dir/$fname"

        quit

    EOF

    

        if [ ${PIPESTATUS[0]} -eq 0 ]; then

            echo "[$(date '+%F %T')] 上传成功: $fname" | tee -a "$LOGFILE"

        else

            echo "[$(date '+%F %T')] 上传失败: $fname" | tee -a "$LOGFILE"

            return 1

        fi

    }

    

    FAIL=0

    upload_latest "$SRC1" "$DST1" || FAIL=1

    upload_latest "$SRC2" "$DST2" || FAIL=1

    

    if [ $FAIL -eq 0 ]; then

        echo "$(date '+%F %T') - 所有备份完成" | tee -a "$LOGFILE"

    else

        echo "$(date '+%F %T') - 部分备份失败,请检查日志" | tee -a "$LOGFILE"

        ding_talk "备份任务执行异常,请登录服务器检查 /var/log/backup_to_win.log"

    fi

    

    exit $FAIL

    

    

四.宝塔计划任务设置:

    类型:Shell 脚本

    

    周期:每天(比如凌晨 3 点执行一次)

    在计划任务里选择 “N 天” → 1 天,时间自定义。

    

    脚本内容:

    bash /www/backup_to_win.sh