我想访问一个需要用户名/密码的URL。我想用curl访问它。现在我正在做的事情是:

curl http://api.somesite.com/test/blah?something=123

我得到一个错误。我想我需要在上面的命令中指定用户名和密码。

我该怎么做呢?


当前回答

其他回答建议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 http://username:password@api.somesite.com/test/blah?something=123

使用-u标志来包含用户名,curl将提示输入密码:

curl -u username http://example.com

你也可以在命令中包含密码,但你的密码将在bash历史中可见:

curl -u username:password http://example.com

简单地说,最安全的方法是使用环境变量来存储/检索凭据。因此,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。

手册中有更多认证方法的示例。

更安全的做法是:

curl --netrc-file my-password-file http://example.com

...由于在命令行上传递普通的用户/密码字符串,这是一个坏主意。

密码文件的格式为(按照man curl):

machine <example.com> login <username> password <password>

注意:

机器名不能包含https://或类似!只有主机名。 “machine”、“login”和“password”只是关键词;真正的信息是那些关键字之后的东西。

要让密码至少不弹出在你的.bash_history:

curl -u user:$(cat .password-file) http://example-domain.tld