我想访问一个需要用户名/密码的URL。我想用curl访问它。现在我正在做的事情是:
curl http://api.somesite.com/test/blah?something=123
我得到一个错误。我想我需要在上面的命令中指定用户名和密码。
我该怎么做呢?
我想访问一个需要用户名/密码的URL。我想用curl访问它。现在我正在做的事情是:
curl http://api.somesite.com/test/blah?something=123
我得到一个错误。我想我需要在上面的命令中指定用户名和密码。
我该怎么做呢?
当前回答
如果你在一个有Gnome密匙环应用程序的系统上,避免直接暴露密码的解决方案是使用gkeyring.py从密匙环中提取密码:
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
其他回答
使用-u标志来包含用户名,curl将提示输入密码:
curl -u username http://example.com
你也可以在命令中包含密码,但你的密码将在bash历史中可见:
curl -u username:password http://example.com
您应该确定身份验证类型。
如果是摘要认证,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'
或者同样的东西,但是语法不同
curl http://username:password@api.somesite.com/test/blah?something=123
向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访问限制可以降低这种情况下的风险。但是,它仍然是文件系统上的一个未加密的文件。
如果你在一个有Gnome密匙环应用程序的系统上,避免直接暴露密码的解决方案是使用gkeyring.py从密匙环中提取密码:
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