我想访问一个需要用户名/密码的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 |
- 这是我也在寻找的解决方案……在命令提示下工作良好。
- 请注意,如果从控制台执行此操作,密码将保留在历史记录中,即…错了。您应该指定just-u用户,curl会在no echo模式下要求您输入密码。
- 请注意,如果导出了http_代理或https_代理,则在URL中嵌入user:pass将失败。
- @Cristianvrabie在技术上是正确的,但如果您从不允许提示的自动脚本运行它,则是不正确的。对那个问题的解决方案很好奇。
- 如果我想在脚本中使用curl,那么更安全的方法是什么?当脚本运行时,我没有选择输入密码,因为我是一个循环中的curl。
- @如果你是从一个脚本运行curl,那么凭证(显然)不会出现在你的历史中,但是它们会出现在ps(1)中。固定:print -- '-u username:password' > somewhere && curl -K somewhere http://...。
- 您可以将凭证放在env变量中以便编写脚本
- 如果密码输入字段的id="whatever"而不是id="password",此命令是否仍然有效?
- 您还应该确保您创建的文件只能由您访问。默认情况下,大多数系统都提供对世界的读取权限。
- @jay环境变量将在命令执行之前进行评估。密码在PS输出中仍然可见。
- @ RobertVa?非常真实
- 不是说实话,但我相信我的答案(stackoverflow.com/a/27894407/758174,即使用--netrc-file)更安全。它将密码保存在历史、ps、您的脚本等之外,这是我在所有脚本和curl的所有验证使用中使用的唯一形式。
- 我用它来开发一个ElasticSearch集群。默认密码是changeme,所以我不担心它会出现在我的历史中,因为它目前只是本地的。一旦我们的CI设置为弹性,我们将切换到一种更安全的查询ElasticSearch的方法。
- Invoke WebRequest:无法处理参数,因为参数名称"u"不明确。可能的匹配项包括:-usebasicparsing-uri-usedefaultcredentials-useragent。
- @Navendennis听起来像是PowerShell的curl没有与原来的功能对等。看看stackoverflow.com/questions/24672760/…
这样做更安全:
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〕只是关键字,实际信息就是这些关键字后面的内容。
- 是的,这使密码不在进程列表和命令历史记录中。更可取的方法是这样做,而且只做了一点工作:)
- 这肯定是可以接受的答案;命令行上的密码是一种可怕的做法。(这是一个众所周知的事实。)
- 这是一个更可接受的答案。
- 您还可以使用标志-K 或--config 通过文件或标准输入接收curl标志。(警告:不要与-k或--insecure混淆!)
- 这是一个卷曲的方法,他们的历史和现状"的过程,但在cleartext用户名和密码的叶子在我的密码的文件创建另一个攻击向量更糟比有比在历史信息文件:bash中,例如,自动restricts权限的历史文件。一个类似的问题,如果使用环境变量,例如arises脚本来设置用户名/密码。如果脚本是不是安全的,他们似乎是。
- 你能提供实际的例子.netrc文件?我可以使用一个用户名/ PW不卷曲的文件,这是你写的答案。
- http和password是一个浴室的想法,使用https
- "steventheeasilyamused i不同意,它会更好地使用一个严格的权限控制cleartext .netrc文件,您的用户可以只读取它,比其他机制(如命令行args),让其他用户读取信息。
- -使用Invoke:a定位参数不能被发现,接受的论点我的密码的文件
或者相同但不同的语法
- 我使用这种语法,因为可以在很多情况下使用。就像从没有卷曲和wget的windows命令,使用start"""http://username:[email protected]/test/blah?something=123"。它可以从任何地方发射。这也适用于ftp登录;d
- 如果用户名中包含@符号,这是否也有效?
- 您需要对用户名和密码进行URL编码才能使用有趣的字符
- 我知道大多数人都知道不要像这个例子那样在URL中发送密码(甚至用户名),因为它很容易被嗅探。尽管如此,我并不否认,但只有在你知道自己在做什么的时候才使用。
- 这是古老的,不应该使用。这是来自ftp days:o
- 好奇的是,它是否安全,例如,即使使用了https,也直接在url中使用user/pass?
- 那么在交通中应该看不到
您也可以通过以下方式发送用户名:
1
| curl -u USERNAME http://server.example |
然后,curl会要求您输入密码,并且密码在屏幕上将不可见(或者如果您需要复制/粘贴命令)。
要安全地传递脚本中的密码(即防止它与ps auxf或日志一起显示),您可以使用-k-标志(从stdin读取config)和Heredoc执行此操作:
1
| curl --url url -K- <<<"--user user:password" |
- 谢谢参考指南--config选项(k)……可能是一个更好的解决方案是把"用户用户:密码"一个简单的文件和你有一个这样的-K the file只读密码复制而复制,在每一个脚本。一个多协议单文件更容易。
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 |
- 本案例中,最终的密码要安静在过程列表,例如,它是可见的人做ps auxw |grep curl在正确的时间。同样的,如果要登录密码sudo运行通过
- 这一方法是目前在A,然后在密码文件(文件.password)这可能是更多的比insecure .bash历史。好的部分是,它是关于这个,唯一的URL,用户名和密码是不泄露在.password - file.
简单地说,最安全的方法是使用环境变量来存储/检索您的凭证。因此,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_USER和API_HASH值的HTTP WWW_Authentication头。-Lk只是告诉curl遵循HTTP30X重定向并使用不安全的TLS处理(即忽略SSL错误)。而双--只是bash语法sugar来停止处理命令行标志。此外,-b cookies.txt和-c cookies.txt标记处理cookies,-b发送cookies,-c在本地存储cookies。
本手册有更多的认证方法示例。
- 记住,使用"LK"CAN的开放你的最中间人(中间人)攻击,那使用谨慎的选择。
- 这不工作……因为那些你expands Bash变量扩展的过程,出现在列表中。
非常简单,请执行以下操作:
1
| curl -X GET/POST/PUT <URL> -u username:password |
- 这不是安全的用户名/密码将不可见在PS的duration of the执行
通常,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