使用cURL和用户名和密码?

Using cURL with a username and password?

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

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

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

我该怎么做?


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

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

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

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


这样做更安全:

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

…因为在命令行上传递纯用户/密码字符串是一个坏主意。

密码文件的格式为(根据man curl的规定):

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

注:

  • 机器名称不能包括https://或类似名称!只是主机名。
  • "EDOCX1"〔3〕、"EDOCX1"〔4〕和"EDOCX1"〔5〕只是关键字,实际信息就是这些关键字后面的内容。

  • 或者相同但不同的语法

    1
    curl http://username:[email protected]/test/blah?something=123


    您也可以通过以下方式发送用户名:

    1
    curl -u USERNAME http://server.example

    然后,curl会要求您输入密码,并且密码在屏幕上将不可见(或者如果您需要复制/粘贴命令)。


    要安全地传递脚本中的密码(即防止它与ps auxf或日志一起显示),您可以使用-k-标志(从stdin读取config)和Heredoc执行此操作:

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


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


    要让密码至少不会出现在您的.bash_history中,请执行以下操作:

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


    简单地说,最安全的方法是使用环境变量来存储/检索您的凭证。因此,curl命令如下:

    1
    curl -Lk -XGET -u"${API_USER}:${API_HASH}" -b cookies.txt -c cookies.txt --"http://api.somesite.com/test/blah?something=123"

    然后调用您的restful api并传递带有base64编码的API_USERAPI_HASH值的HTTP WWW_Authentication头。-Lk只是告诉curl遵循HTTP30X重定向并使用不安全的TLS处理(即忽略SSL错误)。而双--只是bash语法sugar来停止处理命令行标志。此外,-b cookies.txt-c cookies.txt标记处理cookies,-b发送cookies,-c在本地存储cookies。

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


    非常简单,请执行以下操作:

    1
    curl -X GET/POST/PUT <URL> -u username:password


    通常,curl命令称为

    1
    curl https://example.com\?param\=ParamValue -u USERNAME:PASSWORD

    如果您没有任何密码或想跳过命令提示来要求密码,只需将密码部分留空。

    curl https://example.com\?param\=ParamValue -u USERNAME:


    其他答案也建议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网站

    有了这一点,您的凭证就不会以纯文本的形式"静止"(存储)。


    如果您在使用gnome keyring app的系统上,避免直接暴露密码的解决方案是使用gkeyring.py从keyring中提取密码:

    1
    2
    3
    4
    5
    6
    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

    我在bash(Ubuntu16.04LTS)中也有同样的需求,在我的例子中,答案中提供的命令无法工作。我不得不使用:

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

    只有在使用变量时,才需要在-F参数中使用双引号,因此,从命令行... -F 'username=myuser' ...可以。

    如果评论或编辑能解释原因,我会很高兴的!


    你可以使用如下命令:

    1
    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