我想访问一个需要用户名/密码的URL。我想用curl访问它。现在我正在做的事情是:
curl http://api.somesite.com/test/blah?something=123
我得到一个错误。我想我需要在上面的命令中指定用户名和密码。
我该怎么做呢?
我想访问一个需要用户名/密码的URL。我想用curl访问它。现在我正在做的事情是:
curl http://api.somesite.com/test/blah?something=123
我得到一个错误。我想我需要在上面的命令中指定用户名和密码。
我该怎么做呢?
当前回答
您应该确定身份验证类型。
如果是摘要认证,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'
其他回答
我在bash (Ubuntu 16.04 LTS)中有同样的需求,答案中提供的命令在我的情况下无法工作。我不得不使用:
curl -X POST -F 'username="$USER"' -F 'password="$PASS"' "http://api.somesite.com/test/blah?something=123"
-F参数中的双引号仅在使用变量时才需要,因此从命令行…-F 'username=myuser'…会没事的。
相关安全注意:正如Mark Ribau先生在注释中指出的那样,此命令在进程列表中显示密码($PASS变量,展开)!
要让密码至少不弹出在你的.bash_history:
curl -u user:$(cat .password-file) http://example-domain.tld
你也可以这样发送用户名:
curl -u USERNAME http://server.example
然后Curl将要求您输入密码,并且密码将不会在屏幕上显示(或者如果您需要复制/粘贴该命令)。
更安全的做法是:
curl --netrc-file my-password-file http://example.com
...由于在命令行上传递普通的用户/密码字符串,这是一个坏主意。
密码文件的格式为(按照man curl):
machine <example.com> login <username> password <password>
注意:
机器名不能包含https://或类似!只有主机名。 “machine”、“login”和“password”只是关键词;真正的信息是那些关键字之后的东西。
在我的例子中,我需要一个提示符,用户可以输入他们的凭据。
获得用户名和密码提示的最简单方法是以下一行代码:
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