【问题标题】:Azure DevOps Pipeline failure because of secret password with special charactersAzure DevOps Pipeline 失败,因为密码带有特殊字符
【发布时间】:2019-09-20 09:59:16
【问题描述】:

我正在使用 azure devops 构建项目服务器解决方案。

在我的发布管道中,我有多个需要用户凭据作为参数的 powershell 脚本。密码保存在 DevOps 中的一个秘密变量中,并包含一个单引号。

Password: abcd'efgh

这导致管道抛出错误:“字符串缺少终止符:'。”

当我用双引号将密码硬编码到管道中时,脚本会完美执行。

Argument: -password "abcd'efgh"

当我将 DevOps 机密变量放在双引号中时,脚本会执行,但在尝试在服务器上进行身份验证时会出错,这可能是因为传递的密码是“***”。

Argument: -password "$(passwordVariable)"

这里是管道正在执行的脚本的相关部分。非常感谢任何帮助。

param(
  $siteUrl,
  $username,
  $password
)
$encpassword = convertto-securestring -String $password -Force
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $password
Connect-PnPOnline -Url $siteUrl -Credentials $cred

如何将密码输入脚本?

【问题讨论】:

  • 看看这个扩展:marketplace.visualstudio.com/…这可能有用
  • @redleo85 我正面临着同样的情况。你有没有解决过这个问题(不使用市场扩展)?
  • @ 符号也有同样的问题。 "myname@here.com" 转换为 "***"。如果我删除域信息,那很好,"myname" 仍然是"myname"

标签: azure-devops azure-pipelines


【解决方案1】:

您面临的问题是 $(passwordVariable) 变量引用在脚本主体中展开,它由 Powershell 执行之前。这意味着 Powershell 会看到变量值并解释其中的特殊字符。 您可以在所有特殊字符前加上 Powershell 转义字符 (`),但这不是很优雅。

在脚本中访问变量的一种更安全的方法是通过 env 变量 - 您在管道中设置的每个变量 creates an environment variable(名称为大写,. 替换为 _)。

对于常规(非加密)变量,您将:

Do-Something -password "$($env:PASSWORDVARIABLE)"

对于秘密(加密)变量,您必须 explicitly map them 脚本的环境变量。在经典管道中,使用 Environment 部分。在 yaml 中,它看起来像这样:

- pwsh: |
    Do-Something -Password $($env:MAPPED_PASSWORD)
  env:
    MAPPED_PASSWORD: $(passwordVariable)

一个警告:不要使用 SECRET_ 为映射变量添加前缀 - 它不起作用,因为 DevOps 内部使用此前缀。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 2020-10-05
    • 2021-10-12
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多