red*_*o85 6 azure-devops azure-pipelines
我正在使用 azure devops 构建项目服务器解决方案。
在我的发布管道中,我有多个 powershell 脚本,它们需要用户凭据作为参数。密码保存在 DevOps 中的一个秘密变量中,并包含一个单引号。
Password: abcd'efgh
Run Code Online (Sandbox Code Playgroud)
这会导致管道抛出错误:“字符串缺少终止符:'。”
当我用双引号将密码硬编码到管道中时,脚本会完美执行。
Argument: -password "abcd'efgh"
Run Code Online (Sandbox Code Playgroud)
当我将 DevOps 秘密变量放在双引号中时,脚本会执行,但在尝试在服务器上进行身份验证时出现错误,可能是因为传递的密码是“***”。
Argument: -password "$(passwordVariable)"
Run Code Online (Sandbox Code Playgroud)
这是管道正在执行的脚本的相关部分。任何帮助是极大的赞赏。
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
Run Code Online (Sandbox Code Playgroud)
如何将密码输入脚本?
您面临的问题是变量引用在Powershell 执行之前$(passwordVariable)在脚本主体中展开。这意味着 Powershell 会看到变量值并解释其中的特殊字符。您可以使用 Powershell 转义字符 ( ) 在所有特殊字符前面添加,但这不太优雅。`
访问脚本中变量的更安全方法是通过 env 变量 - 您在管道中设置的每个变量都会创建一个环境变量(名称为大写,并.替换为_)。
对于常规(非加密)变量,您将拥有:
Do-Something -password "$($env:PASSWORDVARIABLE)"
Run Code Online (Sandbox Code Playgroud)
对于秘密(加密)变量,您必须将它们显式映射到脚本的环境变量。在经典管道中,使用Environment部分。在 yaml 中,它看起来像这样:
- pwsh: |
Do-Something -Password $($env:MAPPED_PASSWORD)
env:
MAPPED_PASSWORD: $(passwordVariable)
Run Code Online (Sandbox Code Playgroud)
需要注意的是:不要在映射变量前加上SECRET_- 它不会起作用,因为该前缀是 DevOps 内部使用的。
| 归档时间: |
|
| 查看次数: |
1371 次 |
| 最近记录: |