如何在curl命令密码字段中转义“@”

如何在curl命令密码字段中转义“@”

我的用户名是user1密码是mypass8@

我希望将此用户名和密码传递给curl 命令。

@将密码传递给curl命令时如何转义密码?

curl -k -X POST https://user1:mypass8@@myshop.com/job/build

我收到错误消息:

消息:用户的密码/令牌无效:user1

我也尝试了以下操作,但都失败,说明密码与字符不正确2,并且命令未在密码中考虑curl

curl -k -X POST https://'user1:mypass8@'@myshop.com/job/build
curl -k -X POST https://"user1:mypass8@"@myshop.com/job/build
curl -k -X POST https://user1:"mypass8@"@myshop.com/job/build
curl -k -X POST https://user1:'mypass8@'@myshop.com/job/build

更新:我尝试的登录是 Jenkins 管理控制台。

你能建议一下吗?

答案1

网址使用百分比编码又名 URL 编码。

@符号%40在此编码中。

% curl -k -X POST https://user1:mypass8%[email protected]/job/build

或者使用-u/--user参数:

% curl -u user1:mypass8@ -k -X POST https://myshop.com/job/build

RFC 3986 第 3.2.1 节状态:

userinfo 子组件可以由用户名和可选的有关如何获得访问资源的授权的特定于方案的信息组成。用户信息(如果存在)后跟一个@将其与主机分隔开的商业符号(“ ”)。

  userinfo    = *( unreserved / pct-encoded / sub-delims / ":" )

user:password不推荐在 userinfo 字段中使用格式“ ”。应用程序不应将用户信息子组件中第一个冒号(“:”)字符之后的任何数据呈现为明文,除非冒号之后的数据是空字符串(表示没有密码)。当此类数据作为参考的一部分被接收时,应用程序可以选择忽略或拒绝此类数据,并且应拒绝以未加密形式存储此类数据。事实证明,以明文形式传递身份验证信息几乎在所有使用情况下都会存在安全风险。

在可行的情况下,为了用户反馈而呈现 URI 的应用程序(例如在图形超文本浏览中)应该以与 URI 的其余部分区分开的方式呈现用户信息。在用户信息被误导性地制作成看起来像可信域名的情况下,这种呈现将为用户提供帮助(第 7.6 节)。

使用这个小型 Go 应用程序进行了测试:

package main

import (
    "log"
    "net/http"
)

func auth(fn http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        user, pass, _ := r.BasicAuth()
        if !check(user, pass) {
            http.Error(w, `Unauthorized.`, 401)
            return
        }
        fn(w, r)
    }
}

func check(user string, pass string) bool {
    if user == `user` && pass == `pass@` {
        return true
    }

    return false
}

func index(writer http.ResponseWriter, request *http.Request) {
    writer.Write([]byte(`hello, world!`))
}

func main() {
    http.HandleFunc("/", auth(index))
    if err := http.ListenAndServe(":8080", nil); err != nil {
        log.Fatal(err)
    }
}

运行服务器:

% go run .

测试:

% curl -k -X POST http://user:pass%[email protected]:8080/ 
hello, world!

% curl -k -X POST http://user:[email protected]:8080/ 
Unauthorized.

% curl --version
curl 7.72.0 (x86_64-pc-linux-gnu) libcurl/7.72.0 OpenSSL/1.1.1g zlib/1.2.11 zstd/1.4.5 libidn2/2.3.0 libpsl/0.21.1 (+libidn2/2.3.0) libssh2/1.9.0 nghttp2/1.41.0
Release-Date: 2020-08-19
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS GSS-API HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM NTLM_WB PSL SPNEGO SSL TLS-SRP UnixSockets zstd

答案2

我使用 Base64 转换解决了该问题...

echo -n '[USERNAME]:[PASSWORD]' | base64

这将生成一个令牌,以这种方式作为标头传递给curl:

curl -H 'Authorization: Basic [add value obtained from the previous cmd]'

答案3

我已经成功地对 s 进行了 URL 编码@。问题是,当你说 时,它会将用户名视为、密码视为、主机视为 ,这显然是错误的。http://myuser:myp@[email protected]/filemyusermyp[email protected]

所以如果你做类似的事情:

user="myuser"
pass="$( printf 'myp@ssword' | sed 's/@/%40/g' )"
curl "https://${user}:${pass}@host.example.com/file"

你应该有更好的运气。

答案4

不工作:

curl -u user1:mypass8@ -k -X POST https://myshop.com/job/build

在职的:

curl -u 'user1:mypass8@' -k -X POST https://myshop.com/job/build

单引号如果您的密码中有@,则需要“”

相关内容