我想访问一个需要用户名/密码的URL。我想用curl访问它。现在我正在做的事情是:
curl http://api.somesite.com/test/blah?something=123
我得到一个错误。我想我需要在上面的命令中指定用户名和密码。
我该怎么做呢?
我想访问一个需要用户名/密码的URL。我想用curl访问它。现在我正在做的事情是:
curl http://api.somesite.com/test/blah?something=123
我得到一个错误。我想我需要在上面的命令中指定用户名和密码。
我该怎么做呢?
当前回答
如果你的服务器支持基本认证,你可以这样做:
printf 'header="Authorization: Basic %s"' "$(base64 --wrap=0 credentials)"|
curl --config - https://example.org
凭据是存储用户名和密码的文件,格式为username:password。
该解决方案的好处:
不需要转义特殊字符 适用于任何密码,即使它包含空格、引号、反斜杠或其他特殊字符,因此它也可以安全地用于不控制输入的脚本 在带有内置printf的shell中,登录数据不会显示在进程列表中
如果你的shell没有printf作为内置命令,你可以这样做,以避免登录数据出现在进程列表中:
{ printf 'header="Authorization: Basic '; base64 --wrap=0 credentials; printf '"'; }|
curl --config - https://example.org
其他回答
curl -X GET -u username:password {{ http://www.example.com/filename.txt }} -O
要在脚本中安全地传递密码(即防止它与ps auxf或logs一起出现),您可以使用- k -标志(从stdin读取配置)和heredoc:
curl --url url -K- <<< "--user user:password"
其他回答建议netrc指定用户名和密码,根据我所读到的,我同意。下面是一些语法细节:
https://ec.haxx.se/usingcurl-netrc.html
和其他回答一样,我想在这个问题上强调,要注意安全。
虽然我不是专家,但我发现这些链接很有见地:
https://ec.haxx.se/cmdline-passwords.html
总结:
使用加密版本的协议(HTTPS vs HTTP) (FTPS vs FTP)可以帮助避免网络泄漏。
使用netrc可以帮助避免命令行泄漏。
更进一步,似乎还可以使用gpg加密netrc文件
https://brandur.org/fragments/gpg-curl
这样,您的凭据就不会“静止”(存储为纯文本)。
简单地说,最安全的方法是使用环境变量来存储/检索凭据。因此,curl命令如下:
curl -Lk -XGET -u "${API_USER}:${API_HASH}" -b cookies.txt -c cookies.txt -- "http://api.somesite.com/test/blah?something=123"
然后调用您的restful api,并将API_USER和API_HASH的Base64编码值传递给http WWW_Authentication头。lk只是告诉curl遵循http 30x重定向并使用不安全的tls处理(即忽略ssl错误)。而double——只是bash语法中停止处理命令行标志的糖。此外,-b cookie .txt和-c cookie .txt标记处理cookie, -b发送cookie, -c本地存储cookie。
手册中有更多认证方法的示例。
在我的例子中,我需要一个提示符,用户可以输入他们的凭据。
获得用户名和密码提示的最简单方法是以下一行代码:
read -p "Username: " U ; curl -u "$U" <URL> ; unset U
read命令提示输入用户名。-u "$U"参数告诉curl尝试使用用户名$U进行身份验证,并提示输入密码。
作为奖励,密码将只对curl可见,不会在任何日志或历史记录中结束。
curl的手册页有更多关于不同身份验证模式的详细信息: https://curl.se/docs/manpage.html
我也喜欢用户“iammyr”采用的方法。它可以涵盖cURL的身份验证算法失败的情况: https://stackoverflow.com/a/56130884/1239715