首页 > 解决方案 > Azure DevOps Pipeline 失败,因为密码带有特殊字符

问题描述

我正在使用 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

如何将密码输入脚本?

标签: azure-devopsazure-pipelines

解决方案


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

在脚本中访问变量的一种更安全的方法是通过环境变量 - 您在管道中设置的每个变量都会创建一个环境变量(名称是大写的,并且.替换为_)。

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

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

对于秘密(加密)变量,您必须将它们显式映射到脚本的环境变量。在经典管道中,使用Environment部分。在 yaml 中,它看起来像这样:

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

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


推荐阅读