这段 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