使用用户名和密码cURL?

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

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

我得到一个错误。 我想我需要指定一个用户名和密码以及上述命令。

我怎样才能做到这一点?

使用-u标志来包含用户名,curl会提示input密码:

 curl -u username http://example.com 

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

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

做更安全的是:

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

…在命令行上传递普通用户/密码string是一个坏主意。

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

 machine host.domain.com login myself password secret 

(“ machine ”,“ login ”和“ password ”这两个字就是关键字,实际的信息就是那些关键字之后的东西)。

或者相同的东西,但语法不同

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

您也可以通过写入来发送用户名:

 curl -u USERNAME http://server.example 

然后,Curl会询问您的密码,并且密码将不会在屏幕上显示(或者您需要复制/粘贴命令)。

简单而简单地把最安全的方式将是使用环境variables来存储/检索您的凭据。 这样一个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 WWW_Authentication标头API_USERAPI_HASH的Base64编码值。 -Lk只是告诉curl遵循http 30xredirect,并使用不安全的tls处理(即忽略ssl错误)。 而双--只是bash语法糖停止处理命令行标志。 此外, -b cookies.txt-c cookies.txt标志处理cookie,使用-b发送cookie和-c本地存储cookie。

手册中有更多的authentication方法的例子 。

要让密码最less不会popup在您的.bash_history

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

要安全地将密码传递到脚本中(即防止它出现在ps auxf或日志中),可以使用-K-标志(从stdin读取configuration)和heredoc:

 curl --url url -K- <<< "--user user:password" 

如果您使用的是Gnome keyring应用程序,则避免直接暴露密码的解决scheme是使用gkeyring.py从密钥环中提取密码:

 server=server.example.com file=path/to/my/file user=my_user_name pass=$(gkeyring.py -k login -tnetwork -p user=$user,server=$server -1) curl -u $user:$pass ftps://$server/$file -O 

你可以使用命令,

 curl -u user-name -p http://www.example.com/path-to-file/file-name.ext > new-file-name.ext 

然后HTTP密码将被触发。

参考: http : //www.asempt.com/article/how-use-curl-http-password-protected-site

我在bash(Ubuntu 16.04 LTS)中有相同的需求,在我的情况下,答案中提供的命令失败。 我不得不使用:

 curl -X POST -F 'username="$USER"' -F 'password="$PASS"' "http://api.somesite.com/test/blah?something=123" 

双引号在-F参数只需要如果您使用variables,因此从命令行... -F 'username=myuser' ...将没事。

我会很高兴,如果评论或编辑可以解释为什么!