使用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
相关产品推荐
相关产品推荐

