AWS SSM RunShellScript参数解析报错:预期','却收到']'
问题解决:AWS SSM批量更新实例脚本错误修复
错误原因分析
- $?被替换为252:本地Shell执行脚本时,会自动解析
$?这个特殊变量,将其替换为最近一次执行命令的退出状态码(这里是252),而非把变量原封不动传递给远程实例的Shell处理。 - 参数解析报错:
--parameters中的命令包含分号、空格等特殊字符,AWS CLI的解析器会把分号当作命令分隔符,导致后续内容被误判为新的命令参数,引发格式错误。
修复方案
方案1:使用JSON格式定义参数(推荐)
JSON格式能明确界定参数边界,避免特殊字符解析错误,同时保留$?让远程实例处理:
aws ssm send-command --instance-ids "$y" --document-name AWS-RunShellScript --parameters '{"commands": ["yum -y update", "needs-restarting -r", "if [ $? -eq 1 ]; then exit 194; fi"]}' --cloud-watch-output-config "CloudWatchOutputEnabled=true"
方案2:转义特殊变量并正确包裹参数
通过转义$?为\$?,同时用双引号包裹整个commands值,防止本地Shell解析变量,也避免AWS CLI误判参数:
aws ssm send-command --instance-ids "$y" --document-name AWS-RunShellScript --parameters commands="yum -y update; needs-restarting -r; if [ \$? -eq 1 ]; then exit 194; fi" --cloud-watch-output-config "CloudWatchOutputEnabled=true"
方案3:用单引号包裹完整commands参数
单引号会阻止本地Shell解析任何变量和特殊字符,直接将命令原封不动传递给SSM:
aws ssm send-command --instance-ids "$y" --document-name AWS-RunShellScript --parameters 'commands=yum -y update; needs-restarting -r; if [ $? -eq 1 ]; then exit 194; fi' --cloud-watch-output-config "CloudWatchOutputEnabled=true"
内容的提问来源于stack exchange,提问作者Casey
相关产品推荐
相关产品推荐

