使用cURL和用户名和密码?

use*_*114 428 curl credentials

我想访问需要用户名/密码的URL.我想尝试用curl访问它.现在我做的事情如下:

curl http://api.somesite.com/test/blah?something=123
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能做到这一点?

Fin*_*arr 644

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

curl -u username http://example.com
Run Code Online (Sandbox Code Playgroud)

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

curl -u username:password http://example.com
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您从控制台执行此操作,密码将保留在历史记录中,这是错误的.您应该只指定-u用户,而CURL将在无回声模式下询问您的密码. (99认同)
  • @OmarOthman如果你从一个脚本运行curl,凭证(显然)将不会在你的历史记录中结束,但它们将在ps(1)中可见.修复:`print - ' - 用户名:密码'>某处&& curl -K某处http:// ...` (26认同)
  • @CristianVrabie技术上正确,但如果您从不允许提示的自动脚本运行它,则不正确.会对这个问题的解决方案感到好奇. (24认同)
  • @Jay环境变量将在命令执行之前进行评估.密码在ps输出中仍然可见. (7认同)
  • 这不是重点,但我相信我的答案(http://stackoverflow.com/a/27894407/758174,即使用`--netrc-file`)更安全.它将密码保存在历史记录,ps,脚本等之外.这是我在所有脚本中使用的唯一形式以及`curl`的所有经过身份验证的用法. (6认同)
  • 你可以把凭证放在[ENV变量]中(https://www.digitalocean.com/community/tutorials/how-to-read-and-set-environmental-and-shell-variables-on-a-linux-vps)用于编写脚本 (4认同)
  • 如果我想在脚本中“卷曲”,有什么更安全的方法?我无法在脚本运行时输入密码,因为我在循环中“卷曲”。 (2认同)
  • 您还应该确保创建的文件仅供您访问。默认情况下,大多数系统都会授予对世界的读取权限。 (2认同)

Pie*_*e D 230

这样做更安全:

curl --netrc-file my-password-file http://example.com
Run Code Online (Sandbox Code Playgroud)

...因为在命令行上传递普通用户/密码字符串是个坏主意.

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

machine <example.com> login <username> password <password>
Run Code Online (Sandbox Code Playgroud)

注意:

  1. 机器名称不得包含https://或类似!只是主机名.
  2. 单词' machine',' login'和' password'只是关键字; 实际信息是那些关键字之后的东西.

  • 是的,这使密码不在进程列表和命令历史记录之外.更好的方式来做到这一点,只有更多的工作:) (10认同)
  • 这绝对应该是公认的答案; 命令行上的密码是一种可怕的做法.(这是一个众所周知的事实.) (8认同)
  • 您还可以使用标志`-K <file>`或`--config <file>`通过文件或标准输入接收卷曲标志.(警告:不要与`-k`或`--insecure`混淆!) (6认同)
  • @SteventheEasilyAmused我不同意,使用具有适当严格权限的明文`.netrc`文件要好得多,所以只有*你的*用户可以读取它,而不是让*其他*用户读取信息的其他机制(例如命令行参数) . (4认同)
  • 这种curl方法使凭据不受历史记录和进程状态的影响,但将用户名和密码保留在my-password文件中的明文中,从而创建了另一个攻击媒介-比在历史记录文件中包含信息更糟:例如,bash自动限制权限历史文件。如果将环境变量与脚本一起使用来设置用户名/密码,则会出现类似的问题。如果脚本不安全,则凭据也不安全。 (2认同)
  • @SteventheEasilyAmused 提出了一个有效的问题,但可以(与直觉相反)在内置 echo 的 shell 上使用进程替换来解决,如下所示: `curl --netrc-file &lt;(echo "machine example.com Login scott passowrd Tiger “)http://example.com`。这看起来仍然会泄漏进程列表中的密码,但由于没有为内置回显创建进程,所以它应该是安全的。只是不要尝试使用 /bin/echo 来执行此操作 (2认同)

Dan*_*son 74

或者同样的事情,但不同的语法

curl http://username:password@api.somesite.com/test/blah?something=123
Run Code Online (Sandbox Code Playgroud)

  • 您需要对用户名和密码进行URL编码以使用有趣的字符 (8认同)
  • 如果用户名包含@符号,这是否也有效 (6认同)
  • 我使用这种语法,因为可以在更多情况下使用。就像从没有 cURL 和 wGet 的 Windows cmd 一样,使用 `start "" "http://username:password@api.somesite.com/test/blah?something=123"`。它可以从任何地方启动。这也适用于 ftp 登录;D (2认同)
  • 我知道大多数人都知道像这样的示例在URL中不发送密码(甚至用户名),因为它很容易嗅到。照这样说; 我不建议您使用它,仅当您知道自己在做什么时才使用它。 (2认同)
  • 这是非常过时的,不应该使用。这是 FTP 时代的事:o (2认同)
  • 不幸的是,这使得密码在进程列表中可见。 (2认同)
  • @MarkRibau,如果您使用“-u”参数,它不会显示在进程列表中。卷曲的巧妙技巧:-)。请参阅[curl 如何保护密码不出现在 ps 输出中?](https://unix.stackexchange.com/q/385339) (2认同)

Kri*_*ian 61

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

curl -u USERNAME http://server.example
Run Code Online (Sandbox Code Playgroud)

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


小智 23

要在脚本中安全地传递密码(即防止它显示ps auxf或日志),您可以使用-K-标志(从stdin读取配置)和heredoc:

curl --url url -K- <<< "--user user:password"
Run Code Online (Sandbox Code Playgroud)

  • 感谢您对`--config`选项(-K)的引用...可能更好的解决方案是将“ --user user:password”放入文件中,而只需`-K该文件`,这样您就只能密码的一个副本,而不是每个脚本的副本。保护单个文件容易得多。 (2认同)

use*_*364 10

curl -X GET -u username:password  {{ http://www.example.com/filename.txt }} -O
Run Code Online (Sandbox Code Playgroud)

  • 注意:密码将在 shell 历史记录和进程列表中可见。 (2认同)

小智 10

很简单,请执行以下操作:

curl -X GET/POST/PUT <URL> -u username:password
Run Code Online (Sandbox Code Playgroud)

  • 注意:密码将在 shell 历史记录和进程列表中可见 (2认同)

小智 8

其他答案建议 netrc 根据我阅读的内容指定用户名和密码,我同意。下面是一些语法细节:

https://ec.haxx.se/usingcurl-netrc.html

像其他答案一样,我想强调需要注意这个问题的安全性。

虽然我不是专家,但我发现这些链接很有见地:

https://ec.haxx.se/cmdline-passwords.html

总结一下:

使用协议加密版本(HTTPS 与 HTTP)(FTPS 与 FTP)有助于避免网络泄漏。

使用netrc可以帮助避免命令行泄漏。

更进一步,您似乎还可以使用 gpg 加密 netrc 文件

https://brandur.org/fragments/gpg-curl

有了这个,您的凭据就不会“静止”(存储)为纯文本。


Tou*_*aza 8

通常CURL命令称为

curl https://example.com\?param\=ParamValue -u USERNAME:PASSWORD
Run Code Online (Sandbox Code Playgroud)

如果您没有任何密码,或者想跳过命令提示符以要求输入简单密码,请将密码部分留空。

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

  • 注意:密码将在 shell 历史记录和进程列表中可见。 (2认同)

sja*_*jas 6

要让密码最少不要弹出.bash_history:

curl -u user:$(cat .password-file) http://example-domain.tld
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,密码仍然会在进程列表中结束,例如,在正确的时间执行`ps auxw | grep curl`的人可以看到它.同样,如果通过`sudo`运行,将记录密码 (5认同)

小智 6

你可以使用像这样的命令,

curl -u user-name -p http://www.example.com/path-to-file/file-name.ext > new-file-name.ext
Run Code Online (Sandbox Code Playgroud)

然后将触发 HTTP 密码。

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


Mar*_*rco 6

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

curl -X POST -F 'username="$USER"' -F 'password="$PASS"' "http://api.somesite.com/test/blah?something=123"
Run Code Online (Sandbox Code Playgroud)

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

相关安全注意事项:正如Mark Ribau 先生在评论中指出的,此命令在进程列表中显示密码($PASS 变量,已扩展)!


iam*_*myr 6

将凭据传递给curl 的最安全方法是提示插入它们。这就是按照前面的建议传递用户名时发生的情况 ( -u USERNAME)。

但是如果您无法通过这种方式传递用户名怎么办? 例如,用户名可能需要成为 url 的一部分,而只有密码成为 json 负载的一部分。

tl;dr: 这是在这种情况下安全使用curl的方法:

read -p "Username: " U; read -sp "Password: " P; curl --request POST -d "{\"password\":\"${P}\"}" https://example.com/login/${U}; unset P U
Run Code Online (Sandbox Code Playgroud)

read将从命令行提示输入用户名和密码,并将提交的值存储在两个变量中,这些变量可以在后续命令中引用并最终取消设置。

我将详细说明为什么其他解决方案不理想。

为什么环境变量不安全

  1. 无法跟踪环境变量内容的访问和公开模式 (ps -eww ),因为环境对进程隐式可用
  2. 通常,应用程序会获取整个环境并将其记录下来以进行调试或监视目的(有时会记录在磁盘上的纯文本日志文件上,尤其是在应用程序崩溃后)
  3. 环境变量被传递给子进程(因此打破了最小权限原则)
  4. 维护它们是一个问题:新工程师不知道它们在那里,也不了解它们周围的要求 - 例如,不要将它们传递到子流程 - 因为它们没有强制执行或记录。

为什么直接在命令行上将其输入到命令中是不安全的 ,因为您的秘密最终会被任何其他正在运行的用户看到ps -aux,因为它列出了为每个当前正在运行的进程提交的命令。另外,因为您的 secrte 最终会出现在 bash 历史记录中(一旦 shell 终止)。

为什么将其包含在本地文件中不安全 对 文件进行严格的 POSIX 访问限制可以减轻这种情况下的风险。但是,它仍然是文件系统上的一个文件,静态时未加密。

  • 貌似这个方法还是会在进程列表中显示密码? (3认同)

Dwi*_*cer 5

简单而简单地说,最安全的方法是使用环境变量来存储/检索您的凭据.因此卷曲命令如:

curl -Lk -XGET -u "${API_USER}:${API_HASH}" -b cookies.txt -c cookies.txt -- "http://api.somesite.com/test/blah?something=123"
Run Code Online (Sandbox Code Playgroud)

然后就打电话给你宁静的API,并通过HTTP WWW_Authentication使用的Base64编码值头部API_USERAPI_HASH.在-Lk刚刚告诉curl遵循HTTP重定向30倍和使用不安全的TLS处理(即忽略SSL错误).虽然double --只是bash语法糖来停止处理命令行标志.此外,-b cookies.txt-c cookies.txt标志处理cookie,-b发送cookie并-c在本地存储cookie.

该手册有更多的身份验证方法示例.

  • 这不起作用...因为bash为您扩展了这些变量,所以扩展将显示在进程列表中。 (4认同)