我想访问一个需要用户名/密码的URL。我想用curl访问它。现在我正在做的事情是:
curl http://api.somesite.com/test/blah?something=123
我得到一个错误。我想我需要在上面的命令中指定用户名和密码。
我该怎么做呢?
我想访问一个需要用户名/密码的URL。我想用curl访问它。现在我正在做的事情是:
curl http://api.somesite.com/test/blah?something=123
我得到一个错误。我想我需要在上面的命令中指定用户名和密码。
我该怎么做呢?
当前回答
在我的例子中,我需要一个提示符,用户可以输入他们的凭据。
获得用户名和密码提示的最简单方法是以下一行代码:
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
其他回答
向curl传递凭据最安全的方法是提示插入凭据。这是在传递前面建议的用户名(-u username)时发生的情况。
但是如果不能通过这种方式传递用户名呢? 例如,用户名可能需要是url的一部分,而只有密码是json有效负载的一部分。
tl;博士: 下面是在这种情况下如何安全地使用curl:
read -p "Username: " U; read -sp "Password: " P; curl --request POST -d "{\"password\":\"${P}\"}" https://example.com/login/${U}; unset P U
Read将提示从命令行输入用户名和密码,并将提交的值存储在两个变量中,以便在后续命令中引用并最终取消设置。
我将详细说明为什么其他解决方案都不理想。
为什么环境变量不安全
Access and exposure mode of the content of an environment variable, can not be tracked (ps -eww ) since the environment is implicitly available to a process Often apps grab the whole environment and log it for debugging or monitoring purposes (sometimes on log files plaintext on disk, especially after an app crashes) Environment variables are passed down to child processes (therefore breaking the principle of least privilege) Maintaining them is an issue: new engineers don't know they are there, and are not aware of requirements around them - e.g., not to pass them to sub-processes - since they're not enforced or documented.
为什么直接在命令行中输入它是不安全的 因为运行ps -aux的任何其他用户最终都可以看到您的秘密,因为它列出了为每个当前运行的进程提交的命令。 这还因为您的秘密最终会出现在bash历史记录中(一旦shell终止)。
为什么在本地文件中包含它是不安全的 对文件的严格POSIX访问限制可以降低这种情况下的风险。但是,它仍然是文件系统上的一个未加密的文件。
我在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变量,展开)!
简单地说,最安全的方法是使用环境变量来存储/检索凭据。因此,curl命令如下:
curl -Lk -XGET -u "${API_USER}:${API_HASH}" -b cookies.txt -c cookies.txt -- "http://api.somesite.com/test/blah?something=123"
然后调用您的restful api,并将API_USER和API_HASH的Base64编码值传递给http WWW_Authentication头。lk只是告诉curl遵循http 30x重定向并使用不安全的tls处理(即忽略ssl错误)。而double——只是bash语法中停止处理命令行标志的糖。此外,-b cookie .txt和-c cookie .txt标记处理cookie, -b发送cookie, -c本地存储cookie。
手册中有更多认证方法的示例。
在我的例子中,我需要一个提示符,用户可以输入他们的凭据。
获得用户名和密码提示的最简单方法是以下一行代码:
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
在某些API中它可能不起作用(比如rabbitmq)。
还有其他选择:
curl http://username:password@example.com
curl http://admin:123456@example.com
上面的格式也可以在浏览器中使用。