curl 的 netrc 密码含空格时认证失败
curl 7.84.0 起支持 netrc 双引号字符串。核对实际版本、文件选择与解析层,避免密码被截断,并保护明文凭据。
密码中含空格,已经在 .netrc 里加上双引号,curl 请求仍返回 401 Unauthorized。同一凭据交互输入可以使用,换成 netrc 文件后失败时,应先核对 curl 的解析版本,而不是把双引号一层层叠上去。
curl/libcurl 从 7.84.0 起支持 netrc 的双引号字符串。在不支持这项语法的旧版本中,空格会结束字段;引号未必被当作边界符,发送的密码可能只是开头的一段,并带上字面的引号。
本文处理 curl 的 netrc 用户名、密码解析。401 还可能来自凭据失效、接口权限或其他认证机制;只有确认文件内容、实际工具版本与请求目标以后,才能把问题缩小到这一层。其他 FTP 客户端使用的 netrc 方言也不一定相同。
核对执行请求的版本和文件
curl --version
在实际运行脚本的环境里检查,不能用登录终端里的新 curl 代替容器、计划任务或另一台机器上的旧版本。应用通过 libcurl 发请求时,还要核对它加载的库;命令行工具升级不保证应用已经换库。
curl 不会仅因家目录有 .netrc 就默认读取它。诊断时显式指定文件,避免 HOME、运行账户或默认文件选择造成干扰:
curl --netrc-file ./test-auth.netrc \
--silent --show-error --output /dev/null \
--write-out '%{http_code}\n' \
'https://api.example.com/read-only-check'
路径和 URL 都是占位值,目标应是获准测试、采用相应用户认证的 HTTPS 只读接口。不要同时在 URL 或其他选项中设置另一组用户名、密码;那会使判断不再只针对这份文件。示例没有跟随跳转,应先确认直接请求的是正确入口。
新版本中,用 netrc 的双引号包住完整值
在专用测试文件中,结构可以写成:
machine api.example.com
login test-user
password "example password with spaces"
这里的密码只是示例。文件中的双引号由 netrc 解析器处理,不是 Shell 引用,也不是密码本身的一部分。不要把这一行改成 Shell 风格的单引号,或给空格写 %20;这些都不是 curl netrc 的等价编码。
双引号字符串中还支持特定反斜杠转义,例如 \" 表示引号,\n、\r、\t 分别表示相应控制字符。实际凭据含反斜杠或引号时,应按 curl 的解析规则逐字符核对,不能直接复用另一个工具的转义方式。普通带空格密码只需要包住完整值,不需要在每个空格前再加反斜杠。
这项语法要求 curl/libcurl 7.84.0 或更高;版本门槛只说明何时具备能力,不是推荐安装已经过时的版本。按系统维护方式升级到受支持版本,并复核实际执行路径与版本。
暂时不能升级时,不改变服务端密码来迁就解析
对于人工诊断,可以直接让 curl 提示输入密码:
curl --user 'test-user' \
--silent --show-error --output /dev/null \
--write-out '%{http_code}\n' \
'https://api.example.com/read-only-check'
只提供用户名时,curl 会提示输入密码。该办法避免把密码写进命令行,也绕开旧 netrc 的分词问题;它适合交互测试,不是无人值守任务的完整凭据方案。
自动任务应先完成客户端升级或采用其已有的受控凭据传递机制。不要删掉真实密码里的空格、关闭认证,或把密码拼到 URL 中,只为使旧解析器通过。
保护文件,验证实际身份
netrc 保存的是明文凭据。Unix 类环境中,应由执行请求的账户独占读取,使用专用受限目录,并对已经确认归属的普通文件设置受限权限,例如:
chmod 600 ./test-auth.netrc
curl 不会替你拒绝所有权限过宽的文件,因此命令成功不能证明凭据存放安全。不要提交到仓库、打印完整文件或公开 verbose 日志;Windows 则应按当前文件系统的 ACL 限制访问。
machine 按主机名匹配,netrc 的凭据选择不按协议和端口细分。为测试指定单一主机,避免用匹配所有名称的 default 条目;始终保留 HTTPS 证书验证,也不要为处理 401 开启向任意跳转目标转发凭据。
验收时同时确认请求使用预期文件、返回预期账户的只读结果,且没有发生意外重定向。只有 200 状态码还不足以排除登录页面。恢复旧脚本时,也要保留对解析版本的要求;临时测试结束后按凭据管理流程移除专用文件或撤销测试凭据,不动其他任务的 netrc。


