You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求创建Unix环境下每日执行的SFTP远程到本地批量复制脚本

每日批量同步远程SFTP文件到本地的Unix脚本

没问题,结合你给出的手动操作步骤和需求,我帮你写一个可以每日自动执行的批量同步脚本,兼顾灵活性和可维护性:

完整脚本代码

#!/bin/bash

# -------------------------- 配置变量 - 请根据实际情况修改 --------------------------
USERID="pABCDWPPP"                  # 远程SFTP用户名
REMOTE_HOST="170.20.100.10"         # 远程服务器IP
REMOTE_PORT="10000"                 # SFTP端口
MAILBOXPATH="/SRC_path"             # 远程源文件路径
LOCAL_TGT_PATH="/data/TGT_path"     # 本地目标路径
FILE_PATTERN="test-*.csv"           # 要同步的文件匹配规则(按需调整,比如按日期的话可以用test-$(date +%Y%m%d)-*.csv)
LOG_FILE="/var/log/sftp_sync.log"   # 日志文件路径,便于排查问题
# ---------------------------------------------------------------------------------

# 检查本地目标路径是否存在,不存在则创建
if [ ! -d "${LOCAL_TGT_PATH}" ]; then
    mkdir -p "${LOCAL_TGT_PATH}"
    echo "$(date '+%Y-%m-%d %H:%M:%S') - 本地目标路径不存在,已创建: ${LOCAL_TGT_PATH}" >> "${LOG_FILE}"
fi

# 切换到本地目标路径
cd "${LOCAL_TGT_PATH}" || {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - 无法切换到本地目标路径: ${LOCAL_TGT_PATH}" >> "${LOG_FILE}"
    exit 1
}

# 执行SFTP批量下载操作
echo "$(date '+%Y-%m-%d %H:%M:%S') - 开始同步远程文件..." >> "${LOG_FILE}"
sftp -oPort="${REMOTE_PORT}" "${USERID}@${REMOTE_HOST}:${MAILBOXPATH}" << EOF
mget ${FILE_PATTERN}
bye
EOF

# 检查同步是否成功
if [ $? -eq 0 ]; then
    echo "$(date '+%Y-%m-%d %H:%M:%S') - 文件同步完成" >> "${LOG_FILE}"
else
    echo "$(date '+%Y-%m-%d %H:%M:%S') - 文件同步失败,请检查SFTP连接或路径配置" >> "${LOG_FILE}"
fi

关键说明

  • 变量配置区:所有需要自定义的参数都集中在脚本开头,你可以根据实际情况修改。比如如果需要每日同步当天的文件,可以把FILE_PATTERN改成test-$(date +%Y%m%d)-*.csv,这样只会下载当天生成的文件。
  • 日志记录:脚本会把执行状态写入指定的日志文件,方便后续排查同步失败的问题。
  • 路径检查:脚本会自动检查本地目标路径是否存在,不存在则自动创建,避免因路径缺失导致同步失败。

使用步骤

  1. 保存脚本:把上面的代码保存为sftp_sync.sh,比如放在/usr/local/bin/目录下。
  2. 添加执行权限:执行命令赋予脚本可执行权限:
    chmod +x /usr/local/bin/sftp_sync.sh
    
  3. 测试运行:手动执行脚本,验证是否能正常同步文件:
    /usr/local/bin/sftp_sync.sh
    
  4. 配置定时任务:使用crontab设置每日自动执行,比如每天凌晨2点执行:
    执行crontab -e,添加以下内容:
    0 2 * * * /usr/local/bin/sftp_sync.sh
    
    保存退出后,定时任务就会生效。

重要注意事项

  • 免密登录配置:为了避免脚本执行时需要输入密码,建议配置SSH密钥登录:在本地服务器生成密钥对(ssh-keygen),然后把公钥上传到远程服务器的~/.ssh/authorized_keys文件中。
  • 权限问题:确保执行脚本的用户(比如你测试用的infa用户)对本地目标路径有读写权限,同时远程SFTP用户对源路径有读取权限。
  • 文件覆盖问题:如果本地已经存在同名文件,mget会默认覆盖,如果你需要避免覆盖,可以在SFTP交互命令中添加-n参数,改成mget -n ${FILE_PATTERN},这样只会下载本地没有的文件。

内容的提问来源于stack exchange,提问作者goldenbutter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:54:04