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

$in凭据绑定+sh声明性管道的逃逸疯狂

  •  2
  • red888  · 技术社区  · 8 年前

    这是我的密码:“ASD123$567”

    这行不通

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

    我在输出中看到的是mypass没有被混淆,最重要的是它看起来像是在“$”之后被切断了,所以它只显示ASD123

    编辑:我有点搞不清楚这是哪里出的问题,看起来它实际上是转换到Shell步骤的,而这正是导致问题的具体原因。

    3 回复  |  直到 8 年前
        1
  •  2
  •   Hendrik M Halkow    8 年前

    您可以使用凭据功能:

    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

        2
  •  2
  •   red888    8 年前

    我的解决方案(如果您想这样称呼它):

    --password  ${mypass.replaceAll('\\$','\\\\\\$')}
    
        3
  •  1
  •   sudo    8 年前

    我在执行一些远程ssh脚本时遇到了同样的问题 sshagent . 我的密码中有几个$,需要作为参数输入 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
              "
             """
        }
      }
    }