$ in credentials binding + sh逃避声明的声明性管道

时间:2018-02-14 02:16:08

标签: jenkins jenkins-plugins jenkins-pipeline

这是我的密码:" ASD123 $ 567"

这不起作用

withCredentials([usernamePassword(credentialsId: 'creds',
    usernameVariable: 'myuser', passwordVariable: 'mypass')]) {
    sh "some command --username ${myuser} --password ${mypass}"
}

我在输出中看到的是mypass没有被混淆,最重要的是它似乎在" $"之后被切断了。所以它只显示ASD123

编辑:我对这个崩溃的地方感到有些困惑,看起来它实际上是转换到Shell步骤,特别是造成了这个问题。

3 个答案:

答案 0 :(得分:2)

您可以使用凭据功能:

pipeline {
  ...
  stage("Credentials") {
    environment {
      MY_CREDENTIAL = credentials('creds')
    }
    steps {
      // Single quotes!
      sh 'echo ${MY_CREDENTIAL}'
      sh 'echo ${MY_CREDENTIAL_USR}:${MY_CREDENTIAL_PSW}'
    }
  }
}

有关详细信息,请查看https://github.com/jenkinsci/pipeline-model-definition-plugin/wiki/Environment-variables

答案 1 :(得分:0)

我的解决方案(如果你想称之为):

subscriptions

答案 2 :(得分:0)

我在执行一些没有sshagent的远程ssh脚本时遇到了同样的问题。我的密码中有几个$,需要输入mysql -p

作为参数

接受的解决方案对我不起作用,因为当我通过它们时没有一个美元被泄露。 我最终使用两种建议的解决方案${mypass.replaceAll('\\$','\\\\\\$')}

的组合解决了这个问题
pipeline {
  ...
  stage("Credentials") {
    environment {
      MY_CREDENTIAL = credentials('creds')
    }
    steps {
      // Single quotes!
      sh """ 
          ssh user@server "
               mysqldump -u${MY_CREDENTIAL_USR} -p'${MY_CREDENTIAL_PSW.replaceAll('\$','\\\$')}' DBNAME > dump.sql
          "
         """
    }
  }
}