代码之家  ›  专栏  ›  技术社区  ›  u123

'curl:option-----END:is unknown'使用curl将公钥上载到jenkins SSH凭据

  •  0
  • u123  · 技术社区  · 7 年前

    我正在尝试使用此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)
    

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

    2 回复  |  直到 7 年前
        1
  •  0
  •   Alex O    7 年前

    你需要修正引述的论点:

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

    相反,逃跑 " 参数字符串中出现的字符:

    --data-urlencode "json={
      \"\": \"0\",
    [...]
    
        2
  •  0
  •   u123    7 年前

    根据帖子找到解决方案:

    Store JSON directly in bash script with variables?

    所以技巧是这样引用变量: "'"$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"
      }
    }'
    
    推荐文章