azure-devops - 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
如何将密码输入脚本?
解决方案
您面临的问题是$(passwordVariable)
变量引用在脚本主体中扩展,然后由 Powershell 执行。这意味着 Powershell 会看到变量值并解释其中的特殊字符。您可以在所有特殊字符前面加上 Powershell 转义字符 ( `
),但这不是很优雅。
在脚本中访问变量的一种更安全的方法是通过环境变量 - 您在管道中设置的每个变量都会创建一个环境变量(名称是大写的,并且.
替换为_
)。
对于常规(非加密)变量,您将拥有:
Do-Something -password "$($env:PASSWORDVARIABLE)"
对于秘密(加密)变量,您必须将它们显式映射到脚本的环境变量。在经典管道中,使用Environment
部分。在 yaml 中,它看起来像这样:
- pwsh: |
Do-Something -Password $($env:MAPPED_PASSWORD)
env:
MAPPED_PASSWORD: $(passwordVariable)
一个警告:不要在映射变量前面加上SECRET_
- 它不起作用,因为 DevOps 在内部使用这个前缀。
推荐阅读
- java - spring boot通过schema.sql导入程序
- amazon-web-services - ECS 在期望的运行计数为 1 时更新守护程序服务
- java - Spark:从写入的文件读取时时间戳发生变化
- css - 在 Express 静态中使用 .htaccess 将 css/js 文件重定向到 dir 路径
- php - Laravel 5.8 在验证规则中使用数组
- servicestack - Citrix Netscaler 阻止 ServiceStack 服务器事件
- ibm-mobilefirst - Maximo Anywhere 7.6.3 安装
- javascript - 触发onclick时如何从Javascript中的元素检索信息
- php - 搜索显示 HTML 标记的记录
- c++ - 使用 QSqlQueryModel 进行 QT 分页