Windows10环境下shell脚本内curl命令执行失败单独运行正常求助
排查方向
- 核对请求参数大小写与鉴权令牌有效性
从verbose日志可见,脚本执行时实际发起的GET请求参数为UserId(首字母U大写),但你脚本中写的URL参数是userID(ID大写),绝大多数服务端的查询参数为大小写敏感,参数不匹配会直接导致鉴权失败返回403。同时对比日志中Authorization头的令牌长度和你脚本中填写的令牌,确认是否存在sh环境解析时截断令牌、特殊字符转义丢失的问题。 - 确认两个环境调用的curl是否为同一程序
CMD下直接执行curl默认调用Windows系统自带的curl.exe,而sh环境(Git Bash/Cygwin/WSL等)下默认调用的是对应环境内置的curl,两个版本的参数解析规则、默认SSL配置、代理规则都存在差异。分别在CMD执行where curl、在脚本中添加which curl,对比返回的路径是否一致。如果不一致,可以在脚本中将curl替换为绝对路径的Windows原生curl,比如C:\Windows\System32\curl.exe测试。 - 测试URL与参数转义逻辑
sh环境对&、引号、反斜杠的转义规则和CMD不同:- 脚本中的URL如果没有被正确包裹,&会被sh识别为后台运行指令,导致URL被截断
- 输出路径中的
\在sh中会被识别为转义符,可修改为/c/Users/user1/xxx这类POSIX格式路径测试
你可以在脚本开头添加set -x开启调试模式,执行脚本时会输出实际解析后的完整curl命令,和你手动执行的命令逐字符对比是否存在差异。
- 检查网络环境差异
确认sh环境是否配置了独立的代理、hosts规则,导致两个环境的请求出口IP、目标解析IP不同,被服务端的访问策略拦截返回403。可分别在CMD和sh环境下执行公网IP查询命令,对比出口IP是否一致。 - 确认脚本编码格式
即使已移除换行符\r,如果脚本是UTF-8带BOM编码,开头的不可见BOM字符会导致sh解析第一行命令时参数异常,可将脚本另存为UTF-8无BOM格式后重试。
内容的提问来源于stack exchange,提问作者PPSATO
相关产品推荐
相关产品推荐

