首页 > 解决方案 > 'curl: option -----END: is unknown' 使用 curl 将公钥上传到 jenkins SSH 凭证

问题描述

我正在尝试使用此 curl 命令将私钥上传到 Jenkins SSH 凭据:

JENKINS_PRIVATE_KEY_AS_STRING='-----BEGIN RSA PRIVATE KEY----- MIIEo...2qwu8diE -----END RSA PRIVATE KEY-----'

curl -H $CRUMB -X POST "http://$USER:$API_TOKEN@$JENKINS_HOST/credentials/store/system/domain/_/createCredentials" \
--data-urlencode "json={
  "": "0",
  "credentials": {
    "scope": "GLOBAL",
    "id": "jenkins-ssh",
    "username": "jenkins",
    "password": "",
    "privateKeySource": {
      "stapler-class": "com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey$DirectEntryPrivateKeySource",
      "privateKey": "$JENKINS_PRIVATE_KEY_AS_STRING",
    },
    "description": "jenkins-ssh-credentials",
    "stapler-class": "com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey"
  }
}"

但是当我运行上面它失败了:

curl: option -----END: is unknown
curl: try 'curl --help' or 'curl --manual' for more information

为什么变量中的字符串会$JENKINS_PRIVATE_KEY_AS_STRING导致错误,我该如何解决?

基于以下答案,我也尝试过:

curl -H $CRUMB -X POST "http://$USER:$API_TOKEN@$JENKINS_HOST/credentials/store/system/domain/_/createCredentials" \
--data-urlencode "json={
  \"\": \"0\",
  \"credentials\": {
    \"scope\": \"GLOBAL\",
    \"id\": \"jenkins-ssh\",
    \"username\": \"jenkins\",
    \"password\": \"\",
    \"privateKeySource\": {
      \"stapler-class\": \"com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey$DirectEntryPrivateKeySource\",
      \"privateKey\": \"$JENKINS_PRIVATE_KEY_AS_STRING\",
    },
    \"description\": \"jenkins-ssh-credentials\",
    \"stapler-class\": \"com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey\"
  }
}"

但这给出了错误:

: Specified type class com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey is not assignable to the expected class com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey$PrivateKeySource
    at org.kohsuke.stapler.RequestImpl$TypePair.convertJSON(RequestImpl.java:671)
Caused: java.lang.IllegalArgumentException: Failed to instantiate class com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey$PrivateKeySource from {"stapler-class":"com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey","privateKey":"-----BEGIN RSA PRIVATE KEY----- MIIEo...2qwu8diE -----END RSA PRIVATE KEY-----"}
    at org.kohsuke.stapler.RequestImpl$TypePair.convertJSON(RequestImpl.java:680)
    at org.kohsuke.stapler.RequestImpl.bindJSON(RequestImpl.java:478)
    at org.kohsuke.stapler.RequestImpl.instantiate(RequestImpl.java:777)
Caused: java.lang.IllegalArgumentException: Failed to convert the privateKeySource parameter of the constructor public com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey(com.cloudbees.plugins.credentials.CredentialsScope,java.lang.String,java.lang.String,com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey$PrivateKeySource,java.lang.String,java.lang.String)

但不确定它与卷曲部分有关。

标签: jsoncurljenkins

解决方案


您需要修复参数引用:

                 v
--data-urlencode "json={
  "": "0",
  ^

相反,转义"出现在参数字符串中的字符:

--data-urlencode "json={
  \"\": \"0\",
[...]

推荐阅读