Sftp文件自动化同步脚本

这段 Bash 脚本用于自动化文件同步操作,具体是通过 SFTP(Secure File Transfer Protocol)在两个服务器之间同步文件。

效果图

在这里插入图片描述

以下是对这段代码的详细解析:

脚本头部

#!/bin/bash
  • 指定使用 Bash 解释器来运行脚本。

配置部分

SOURCE_USER="source_user"
SOURCE_PASS="source_password"
SOURCE_HOST="source_server.com"
SOURCE_DIR="/path/to/source/dir"

TARGET_USER="target_user"
TARGET_PASS="target_password"
TARGET_HOST="target_server.com"
TARGET_DIR="/path/to/target/dir"
  • 定义了源服务器和目标服务器的连接信息,包括用户名、密码、主机地址和目录路径。

其他设置

LFTP_CMD=$(which lftp)
  • 使用 which 命令查找 lftp 命令的路径,并将其存储在 LFTP_CMD 变量中。lftp 是一个命令行 FTP/SFTP 客户端。

日志函数

log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1"
}
  • 定义了一个日志函数,用于输出带有时间戳的消息。

同步函数

sync_files() {
    log "开始同步文件..."
    TEMP_DIR="$HOME/sftp_sync_temp"

    $LFTP_CMD <<EOF
        set sftp:auto-confirm yes
        set net:max-retries 3
        set net:reconnect-interval-base 5
        set net:reconnect-interval-multiplier 1
        
        open -u "$SOURCE_USER","$SOURCE_PASS" sftp://$SOURCE_HOST
        !mkdir -p "$TEMP_DIR" && echo "临时目录创建成功" || echo "临时目录创建失败"
        mirror --only-newer --verbose "$SOURCE_DIR" "$TEMP_DIR"
        close

        open -u "$TARGET_USER","$TARGET_PASS" sftp://$TARGET_HOST
        mirror -R --only-newer --verbose "$TEMP_DIR" "$TARGET_DIR"
        !rm -rf "$TEMP_DIR"
        
        bye
EOF
    if [ $? -ne 0 ]; then
        log "文件同步过程中出现错误。"
    else
        log "文件同步完成。"
    fi
}
  • sync_files 函数执行文件同步操作:
    • 使用 lftp 命令连接源服务器,下载更新的文件到本地临时目录。
    • 然后连接目标服务器,将本地临时目录中的文件上传到目标服务器。
    • 使用 mirror 命令实现目录同步,--only-newer 参数确保只同步更新的文件。
    • -R 选项用于从本地到远程的反向同步。
    • 临时目录在同步完成后被删除。
    • EOF 用于结束 lftp 的多行命令输入。
    • 检查 lftp 命令的退出状态码来判断同步是否成功。

主循环

while true; do
    sync_files
    log "等待10分钟后再次检查..."
    sleep 600  # 600秒 = 10分钟
done
  • 脚本进入一个无限循环,每 10 分钟调用一次 sync_files 函数进行文件同步。

依赖和执行提示

# 依赖安装:sudo apt-get install lftp
# nohup sh sync_sftp_file.sh > ./logs/sync_sftp_file.log 2>&1 &
# pkill -9 -f sync_sftp_file.sh
  • 注释部分提供了 lftp 的安装命令。
  • 提供了一种在后台运行脚本的方式(nohup),并将输出重定向到日志文件。
  • 提供了停止脚本的命令(pkill)。

完整代码

#!/bin/bash

# 配置部分
SOURCE_USER="source_user"
SOURCE_PASS="source_password"
SOURCE_HOST="source_server.com"

TARGET_USER="target_user"
TARGET_PASS="target_password"
TARGET_HOST="target_server.com"

# lftp命令路径
LFTP_CMD=$(which lftp)

# 日志函数,打印带时间戳的日志
log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1"
}

# 同步函数,接收源目录和目标目录作为参数
sync_files() {
    local source_dir="$1"
    local target_dir="$2"

    log "开始同步文件..."
	log "source_dir: $source_dir, target_dir: $target_dir"
    TEMP_DIR="$HOME/sftp_sync_temp"

    $LFTP_CMD <<EOF
        set sftp:auto-confirm yes
        set net:max-retries 3
        set net:reconnect-interval-base 5
        set net:reconnect-interval-multiplier 1
        
        # 连接源服务器
        open -u "$SOURCE_USER","$SOURCE_PASS" sftp://$SOURCE_HOST
        
        # 创建一个临时本地目录
        !mkdir -p "$TEMP_DIR" && echo "临时目录创建成功" || echo "临时目录创建失败"
        
        # 从源服务器下载文件到临时目录
        mirror --only-newer --verbose "$source_dir" "$TEMP_DIR"
        
        # 关闭源服务器连接
        close

        # 连接目标服务器
        open -u "$TARGET_USER","$TARGET_PASS" sftp://$TARGET_HOST
        
        # 上传文件到目标服务器(使用 -R 选项)
        mirror -R --only-newer --verbose "$TEMP_DIR" "$target_dir"
        
        # 清理临时目录
        !rm -rf "$TEMP_DIR"
        
        bye
EOF
    if [ $? -ne 0 ]; then
        log "文件同步过程中出现错误。"
    else
        log "文件同步完成。"
    fi
}

# 主循环,每10分钟检查一次
while true; do
    # 在这里传递实际的源目录和目标目录
    sync_files "/path/to/source/dir" "/path/to/target/dir"
    log "等待10分钟后再次检查..."
    sleep 600  # 600秒 = 10分钟
done

# 依赖安装:sudo apt-get install lftp
# nohup sh sync_sftp_file.sh > ./logs/sync_sftp_file.log 2>&1 &
# pkill -9 -f sync_sftp_file.sh

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值