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

使用Curl通过SFTP下载文件时的校验错误问题

问题排查与修复方案

看起来你的脚本有几个关键问题,导致不管实际下载是否成功,都会输出“File downloaded successfully”。我来帮你逐一拆解并修复:

1. Shebang 语法错误

脚本第一行的 #!bin/bash 少了开头的 /,正确写法应该是 #!/bin/bash。这个错误会导致系统无法正确调用bash解释器,后续的判断逻辑自然会失效。

2. Curl 参数与URL格式错误

  • SFTP URL格式不正确:必须写成 sftp://domain/path/to/your/file.zip,你漏掉了 //,而且没指定具体的文件路径,curl根本定位不到要下载的目标文件。
  • 无效参数冗余:-k 是用来忽略HTTPS证书验证的,对SFTP完全没用;-ssl 是错误的参数(单短杠下会被解析为 -s -s -l,导致参数混乱),SFTP基于SSH协议,不需要SSL相关参数。
  • 密码明文风险:虽然不是当前问题的直接原因,但脚本里明文写密码非常不安全,后面会给出更安全的替代方案。

3. 缺少文件有效性校验

就算curl返回了0(执行状态码正常),也可能出现远程文件不存在、下载得到空文件的情况。只检查curl的退出码不够,得额外验证文件是否真的有效。


修复后的完整脚本

#!/bin/bash
# 配置参数,按需修改
REMOTE_FILE="sftp://your-domain.com/path/to/target/file.zip"
LOCAL_FILE="file.zip"
SFTP_USER="user"
SFTP_PASS="user"

# 执行SFTP下载
curl -u "${SFTP_USER}:${SFTP_PASS}" -o "${LOCAL_FILE}" "${REMOTE_FILE}"

# 检查curl执行状态
if [[ $? -ne 0 ]]; then
    echo "Failed to download file"
    exit 1
fi

# 额外校验:文件存在且大小大于0
if [[ ! -f "${LOCAL_FILE}" || $(stat -c%s "${LOCAL_FILE}") -eq 0 ]]; then
    echo "Downloaded file is empty or missing"
    exit 1
fi

echo "File downloaded successfully"

额外建议

  • 如果SFTP服务器使用非默认端口(不是22),要在URL里加上端口,比如 sftp://your-domain.com:2222/path/to/file.zip。
  • 强烈建议用SSH密钥认证替代明文密码:生成SSH密钥后,把公钥上传到远程服务器的~/.ssh/authorized_keys里,这样脚本里可以去掉 -u "${SFTP_USER}:${SFTP_PASS}" 参数,既安全又避免密码泄露。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:29:43