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

如何给bash脚本添加条件,实现SFTP无csv文件时发告警邮件

Bash脚本修改方案

核心实现思路

先主动查询SFTP服务器上是否存在目标csv文件,只有确认文件存在时才执行后续下载、迁移、导入流程,不存在时直接触发邮件告警并终止脚本。

修改后完整脚本

#!/bin/bash
# 配置项统一管理,按需修改
SFTP_USER="ftp"
SFTP_PASS="password"
SFTP_PORT="22001"
SFTP_SERVER="server"
LOCAL_SAVE_PATH="path/where/to/be/grabbed"
ORIGIN_FILE_PATH="original/path"
DEST_FILE_PATH="destination/path"
MYSQL_LOGIN_PATH="user"
ALERT_EMAIL="admin@example.com"

# 第一步:检测SFTP服务器是否存在csv文件
sftp_file_exist=$(sshpass -p "${SFTP_PASS}" sftp -P "${SFTP_PORT}" "${SFTP_USER}@${SFTP_SERVER}" <<-'EOSSH'
ls *.csv
EOSSH
)

# 判断是否检测到csv文件,没有则发告警退出
if [[ ! ${sftp_file_exist} =~ \.csv$ ]]; then
    # 发送告警邮件,可根据实际环境调整mailx为sendmail等其他邮件客户端
    echo "SFTP服务器${SFTP_SERVER}未检测到待导入的csv文件,导入任务终止" | mailx -s "【告警】CSV数据导入任务失败" "${ALERT_EMAIL}"
    exit 1
fi

# 第二步:文件存在时执行原有正常流程
# 下载csv文件
sshpass -p "${SFTP_PASS}" sftp -P "${SFTP_PORT}" "${SFTP_USER}@${SFTP_SERVER}" <<-'EOSSH1'
lcd path/where/to/be/grabbed
get *.csv
EOSSH1

# 移动文件并修改权限
mv "${ORIGIN_FILE_PATH}" "${DEST_FILE_PATH}"
chmod 777 "${DEST_FILE_PATH}"  # 生产环境建议调整为最小必要权限,如644/755

# 导入MySQL
mysql --login-path="${MYSQL_LOGIN_PATH}" < cmds.txt

关键逻辑说明

  • 变量${sftp_file_exist}存储SFTP服务器上ls *.csv的执行结果,通过正则匹配判断是否存在.csv后缀的文件
  • 邮件告警依赖系统已配置好邮件发送服务,若mailx命令不存在可替换为当前环境可用的邮件发送命令
  • 原脚本的下载、迁移、导入逻辑没有改动,仅在确认文件存在后才会执行

可选优化项

  • 生产环境不建议明文写SFTP密码在脚本中,可替换为SSH密钥认证方式
  • 可添加文件下载完成后的完整性校验,避免下载不完整导致导入失败
  • 可添加MySQL导入结果的判断,导入失败时也触发告警

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 08:18:01