传输文件脚本

拉取远程多个IP的文件

这个脚本定义了$REMOTE_IP为对端IP的前三段,脚本内定义的是10.10.10.
最后一段取值是本地根目录下所有的目录名称,组合为一组IP
拉取这组IP下的特定文件

#!/bin/bash

# 定义本地的根目录
LOCAL_BASE_DIR="/home/data/mysqlbak"

# 定义远程备份模块和账号信息
REMOTE_MODULE="userbackup"
USERNAME="zhangqiang"
PASSWORD="zhangqiang"

# 生成 rsync 密码文件
PASSWORD_FILE="/tmp/rsync_pass.txt"
echo "$PASSWORD" > "$PASSWORD_FILE"
chmod 600 "$PASSWORD_FILE"

# 计算上两周的周六日期
LAST_SATURDAY=$(date -d 'last saturday' '+%Y-%m-%d')
WEEK_BEFORE_LAST_SATURDAY=$(date -d 'last saturday - 1 week' '+%Y-%m-%d')

# 需要传输的目录
DIRS_TO_SYNC=("$WEEK_BEFORE_LAST_SATURDAY" "$LAST_SATURDAY")

# 定义一个日志文件
LOG_FILE="/tmp/rsync_sync.log"
echo "Starting rsync synchronization at $(date)" > "$LOG_FILE"

# 动态获取LOCAL_BASE_DIR下的所有目录
DIRS=$(find "$LOCAL_BASE_DIR" -mindepth 1 -maxdepth 1 -type d -printf "%f\n")

# 遍历目录并传输符合条件的目录
for DIR in $DIRS; do
    # 远程IP
    REMOTE_IP="10.10.10.$DIR"
    echo "Processing remote IP: $REMOTE_IP" >> "$LOG_FILE"

    for SYNC_DIR in "${DIRS_TO_SYNC[@]}"; do
        # 远程路径
        REMOTE_PATH="${USERNAME}@${REMOTE_IP}::${REMOTE_MODULE}/${SYNC_DIR}/"
        
        # 本地路径
        LOCAL_PATH="${LOCAL_BASE_DIR}/${DIR}/${SYNC_DIR}"
        
        # 创建本地目录(如果不存在)
        mkdir -p "$LOCAL_PATH"
        
        # 记录传输开始的日志
        echo "Starting rsync for directory: $SYNC_DIR from $REMOTE_IP to $LOCAL_PATH" >> "$LOG_FILE"
        
        # 使用 rsync 进行同步,并记录输出和错误
        rsync -avz --password-file="$PASSWORD_FILE" "$REMOTE_PATH" "$LOCAL_PATH" >> "$LOG_FILE" 2>&1 &
    done
done

# 等待所有后台任务完成
wait

# 删除临时密码文件
rm -f "$PASSWORD_FILE"

echo "Rsync synchronization completed at $(date)" >> "$LOG_FILE"

将本地路径推送至多个IP

#!/bin/bash

# 配置参数
TARGET_SERVERS=("192.168.0.1" "192.168.0.2" "192.168.0.3")
USERNAME="zhangqiang"
PASSWORD="zhangqiang"
RSYNC_MODULE="weather"
DAYS_AGO=7 # 传输最近几天的文件 传输当天的设置为0
MAX_RETRIES=5 # 最大尝试次数

# 源目录和目标路径的对应关系
declare -A DIRECTORY_MAPPING=(
    ["/home/zhangqiang/1/"]="/90/1"
    ["/home/zhangqiang/0/"]="/90/0"
    ["/home/zhangqiang/92/1/"]="/92/1"
)

# 生成 rsync 密码文件
PASSWORD_FILE="/tmp/rsync_pass.txt"
generate_password_file() {
    echo "$PASSWORD" > "$PASSWORD_FILE"
    chmod 600 "$PASSWORD_FILE"
}

# 删除密码文件
cleanup() {
    rm -f "$PASSWORD_FILE"
}

# 捕获中断信号以停止所有后台进程
trap "cleanup; kill 0" EXIT

# rsync 传输函数
rsync_transfer() {
    local target_server="$1"
    local source_dir="$2"
    local target_dir="$3"
    local retries=0

    echo "正在传输目录: $source_dir 到 $target_server:$target_dir"

    # 查找最近几天的文件
    recent_files=$(find "$source_dir" -type f -newermt "$(date -d "$DAYS_AGO days ago" +%Y-%m-%d)" ! -newermt "$(date +%Y-%m-%d -d tomorrow)")

    # 如果没有找到文件,跳过此传输
    if [ -z "$recent_files" ]; then
        echo "没有找到最近 $DAYS_AGO 天的文件。"
        return
    fi

    rsync_options=(
        -azvr
        --usermap=1002:1000
        --groupmap=1002:1000
        --password-file="$PASSWORD_FILE"
        --rsync-path="mkdir -p $RSYNC_MODULE$target_dir && rsync"
        "$source_dir"
        "$USERNAME@$target_server::$RSYNC_MODULE$target_dir"
    )

    while [ $retries -lt $MAX_RETRIES ]; do
        rsync "${rsync_options[@]}"
        if [ $? -eq 0 ]; then
            echo "目录 $source_dir 中的文件传输到 $target_server 成功!"
            break
        else
            echo "目录 $source_dir 中的文件传输到 $target_server 失败!将在10分钟后重试。"
            retries=$((retries + 1))
            sleep 600
        fi
    done

    if [ $retries -eq $MAX_RETRIES ]; then
        echo "传输到 $target_server 失败次数已达最大值 $MAX_RETRIES 次。停止传输。"
    fi
}

# 主程序执行流程
main() {
    generate_password_file

    for target_server in "${TARGET_SERVERS[@]}"; do
        for source_dir in "${!DIRECTORY_MAPPING[@]}"; do
            target_dir="${DIRECTORY_MAPPING[$source_dir]}"
            rsync_transfer "$target_server" "$source_dir" "$target_dir" &
        done
    done

    wait # 等待所有后台进程完成

    cleanup
}

main

推送文件至特定服务器的多个路径下

#!/bin/bash

# 配置参数
TARGET_SERVER="192.168.0.1"
USERNAME="zhangqiang"
PASSWORD="zhangqiang%"
RSYNC_MODULE="mk"

# 源目录和目标路径的对应关系
declare -A DIRECTORY_MAPPING=(
    ["/home/zhangqiang/1/"]="/90/1"
    ["/home/zhangqiang/0/"]="/90/0"
)

# 生成 rsync 密码文件
PASSWORD_FILE="/tmp/rsync_pass.txt"
generate_password_file() {
    echo "$PASSWORD" > "$PASSWORD_FILE"
    chmod 600 "$PASSWORD_FILE"
}

# 删除密码文件
cleanup() {
    rm -f "$PASSWORD_FILE"
}

# rsync 传输函数
rsync_transfer() {
    local source_dir="$1"
    local target_dir="$2"

    echo "正在传输目录: $source_dir 到 $target_dir"

    rsync_options=(
        -avz
        # --chown=${TARGET_UID}:${TARGET_GID}     # --chown 选项被用来指定文件的所有者和组
        --password-file="$PASSWORD_FILE"
        --rsync-path="mkdir -p $RSYNC_MODULE$target_dir && rsync"
        "$source_dir"
        "$USERNAME@$TARGET_SERVER::$RSYNC_MODULE$target_dir"
    )

    while true; do
        rsync "${rsync_options[@]}"
        if [ $? -eq 0 ]; then
            echo "目录 $source_dir 中的文件传输成功!"
            break
        else
            echo "目录 $source_dir 中的文件传输失败!将在10分钟后重试。"
            sleep 600
        fi
    done
}

# 主程序执行流程
main() {
    generate_password_file

    for source_dir in "${!DIRECTORY_MAPPING[@]}"; do
        target_dir="${DIRECTORY_MAPPING[$source_dir]}"
        rsync_transfer "$source_dir" "$target_dir"
    done

    cleanup
}

main
posted @ 2024-06-28 18:04  张强0514  阅读(1)  评论(0编辑  收藏  举报