使用Shell脚本FTP上传文件时遇curl(28)超时错误求助
解决curl FTP上传超时(421明文会话拒绝)问题
从你添加-v参数后的curl日志里,关键错误信息已经非常明确:
< 421 Sorry, cleartext sessions are not accepted on this server.
你的FTP服务器强制要求使用加密的FTPS(FTP over TLS)连接,而当前的curl命令用的是普通明文FTP协议,服务器直接拒绝了未加密的连接请求,这才导致curl触发了超时错误(本质是服务器主动断开连接,curl误判为超时)。
解决方案:修改curl命令启用FTPS加密
你需要给curl添加FTPS相关参数,让它使用加密会话连接服务器。推荐使用--ftp-ssl-reqd参数,这个参数会强制curl使用TLS加密建立连接,如果无法创建加密连接就直接终止请求,正好匹配你服务器的安全要求。
修改后的curl命令如下:
curl --ftp-create-dirs --ftp-ssl-reqd -T $f -u $FTP_USER:$FTP_PASS ftp://$FTP_ADDRESS/var/www/test/$f
额外说明
- 如果你的服务器使用的是隐式FTPS(默认端口990),需要把URL里的端口改成990,比如
ftp://$FTP_ADDRESS:990/var/www/test/$f;不过从日志看你连接的是21端口,属于显式FTPS,用上面的命令即可。 - 如果遇到证书验证失败的问题(比如Travis环境不信任服务器证书),可以临时添加
--insecure参数跳过验证(仅用于测试场景,生产环境不推荐):curl --ftp-create-dirs --ftp-ssl-reqd --insecure -T $f -u $FTP_USER:$FTP_PASS ftp://$FTP_ADDRESS/var/www/test/$f - 最后再确认下变量名:你提到配置的是
FTP_PASSWORD,但脚本里使用的是FTP_PASS,不过从日志看已经成功发送USER命令,说明变量映射是正确的,这个可以忽略,但如果后续出现认证问题可以优先排查这里。
修改后重新运行脚本,应该就能正常完成文件上传了。
内容的提问来源于stack exchange,提问作者Harry Cameron
相关产品推荐
相关产品推荐

