You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向ARM模板自定义扩展传递含特殊字符的字符串?密码截断求助

问题解答

根因说明

你遇到的截断问题和ARM模板的传参能力无关,是shell命令的特殊字符解析机制导致的:

  • #在shell语法中是注释起始标记,你直接将密码拼接到执行命令中时,#之后的所有内容都会被shell识别为注释直接丢弃,因此你只能拿到#之前的fkdl2
  • 除#外,&、$、*、空格、引号等shell特殊字符都会导致参数解析异常

修复方案

方案1:单引号包裹敏感参数(适用无单引号的密码场景)

shell中单引号包裹的字符串会被识别为纯文本,不会做特殊字符解析。ARM模板中需要用两个连续单引号转义单个单引号,修改后的配置如下:

"properties":{
   "publisher":"Microsoft.Azure.Extensions",
   "type":"CustomScript",
   "typeHandlerVersion":"2.1",
   "autoUpgradeMinorVersion":true,
   "settings":{
      "skipDos2Unix":false,
      "timestamp":123456789
   },
   "protectedSettings":{
      "commandToExecute":"[concat('sh /example/dir/setup.sh ''', parameters('password'), '''')]"
   }
 }

拼接后最终执行的命令为sh /example/dir/setup.sh 'fkdl2#dlsj',可以正常传递完整密码。

方案2:Base64编码传参(适用所有场景,兼容性最强)

如果密码中可能包含单引号等更复杂的特殊字符,可以通过Base64编码规避shell解析问题:

  1. ARM模板中先对密码做Base64编码后再传递
"protectedSettings":{
   "commandToExecute":"[concat('sh /example/dir/setup.sh ', base64(parameters('password')))]"
}
  1. 在setup.sh脚本中对传入的参数做Base64解码即可得到原始密码:
#!/bin/bash
RAW_PASSWORD=$(echo "$1" | base64 -d)
# 后续使用RAW_PASSWORD变量即可

注意事项

你当前将敏感参数放在protectedSettings下的写法是规范的,不要将密码等敏感信息放在明文的settings配置中,避免泄露。

内容的提问来源于stack exchange,提问作者prola

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 10:36:03