如何向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解析问题:
- ARM模板中先对密码做Base64编码后再传递
"protectedSettings":{ "commandToExecute":"[concat('sh /example/dir/setup.sh ', base64(parameters('password')))]" }
- 在
setup.sh脚本中对传入的参数做Base64解码即可得到原始密码:
#!/bin/bash RAW_PASSWORD=$(echo "$1" | base64 -d) # 后续使用RAW_PASSWORD变量即可
注意事项
你当前将敏感参数放在protectedSettings下的写法是规范的,不要将密码等敏感信息放在明文的settings配置中,避免泄露。
内容的提问来源于stack exchange,提问作者prola
相关产品推荐
相关产品推荐

