我正在使用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
如何将密码输入脚本?
答案 0 :(得分:1)
您面临的问题是 $(passwordVariable)
变量引用在脚本主体中展开,之前它由 Powershell 执行。这意味着 Powershell 会看到变量值并解释其中的特殊字符。
您可以在所有特殊字符前加上 Powershell 转义字符 (`
),但这不是很优雅。
访问脚本中变量的一种更安全的方法是通过环境变量 - 您在管道中设置的每个变量 creates an environment variable(名称为大写,.
被替换为 {{1 }}).
对于常规(非加密)变量,您将:
_
对于秘密(加密)变量,您必须 explicitly map them 到脚本的 env 变量。在经典管道中,使用 Do-Something -password "$($env:PASSWORDVARIABLE)"
部分。在 yaml 中,它看起来像这样:
Environment
一个警告:不要使用 - pwsh: |
Do-Something -Password $($env:MAPPED_PASSWORD)
env:
MAPPED_PASSWORD: $(passwordVariable)
作为映射变量的前缀 - 它不起作用,因为 DevOps 在内部使用此前缀。