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

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

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

我该怎么做呢?


当前回答

如果你在一个有Gnome密匙环应用程序的系统上,避免直接暴露密码的解决方案是使用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

curl -X GET -u username:password  {{ http://www.example.com/filename.txt }} -O

您应该确定身份验证类型。

如果是摘要认证,http头为:

GET /xxxxxxxxxxx HTTP/1.1
Host: 192.168.3.142
User-Agent: Go-http-client/1.1
Authorization: Digest username="admin", realm="admin@51200304-49-test", nonce="5.1722929000077545", uri="/xxxxxxxxxxx", response="52d30eba90820f2c4fa4d3292a4a7bbc", cnonce="f11900fe0906e3899e0cc431146512bb", qop=auth, nc=00000001
Accept-Encoding: gzip

你可以使用——digest选项:

    curl  --digest -u 'username:password' 'http://xxxxxxxxxxx'

在某些API中它可能不起作用(比如rabbitmq)。

还有其他选择:

curl http://username:password@example.com

curl http://admin:123456@example.com

上面的格式也可以在浏览器中使用。

在我的例子中,我需要一个提示符,用户可以输入他们的凭据。

获得用户名和密码提示的最简单方法是以下一行代码:

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