传输文件脚本
拉取远程多个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 # 最大尝试次数
SERVER_INTERVAL=300 # 每台服务器传输间隔时间(秒)
# 源目录和目标路径的对应关系
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 i in "${!TARGET_SERVERS[@]}"; do
target_server="${TARGET_SERVERS[$i]}"
for source_dir in "${!DIRECTORY_MAPPING[@]}"; do
target_dir="${DIRECTORY_MAPPING[$source_dir]}"
rsync_transfer "$target_server" "$source_dir" "$target_dir" &
done
# 等待所有后台进程完成
wait
# 只在不是最后一个服务器时设置间隔时间传输到下一台服务器
if [ $i -lt $((${#TARGET_SERVERS[@]} - 1)) ]; then
echo "传输到 $target_server 完成,等待 $SERVER_INTERVAL 秒后继续传输下一台服务器。"
sleep "$SERVER_INTERVAL"
fi
done
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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程使用 AI 从 0 到 1 写了个小工具
· 快收藏!一个技巧从此不再搞混缓存穿透和缓存击穿
· AI 插件第二弹,更强更好用
· Blazor Hybrid适配到HarmonyOS系统
· 支付宝 IoT 设备入门宝典(下)设备经营篇