PowerShell 5.1中AWS SSM start-session传递JSON参数失败的求助
PowerShell 5.1中AWS SSM start-session传递JSON参数失败的求助
兄弟我太懂你这种反复试各种转义、各种写法都碰壁的崩溃了!PowerShell 5.1的引号转义确实有时候让人头大,尤其是和AWS CLI这类需要精确传递JSON参数的工具配合时,简直是噩梦级考验。我来给你几个经过验证的可行方案,应该能解决你的问题:
方案一:绕开转义,用AWS CLI的file://语法直接读JSON文件
这绝对是最省心的方法,完全避开PowerShell的引号解析坑:
- 新建一个文本文件,比如命名为
ssm-params.json,把你的JSON内容原封不动写进去:{"command":["bash -lc 'sudo -iu myuser -l'"]} - 然后在PowerShell里执行命令,用
file://指向这个文件:
AWS CLI会直接读取文件里的原生JSON,不会有任何转义问题。aws ssm start-session --profile myprofile --target i-xxxxx --document-name my-bootstrap --parameters file://ssm-params.json
方案二:针对PowerShell 5.1的正确双引号转义写法
如果不想用文件,就得严格按照PowerShell 5.1的外部命令参数转义规则来:
整个JSON参数要用双引号包裹,同时JSON内部的每一个双引号都要用PowerShell的反引号`(就是键盘上Tab键上面那个键)来转义,具体命令如下:
aws ssm start-session --profile myprofile --target i-xxxxx --document-name my-bootstrap --parameters "`{"command":`["bash -lc 'sudo -iu myuser -l'`"]`}"
或者你可以先把转义后的JSON存到变量里,再调用命令,这样更清晰:
$jsonParams = "`{"command":`["bash -lc 'sudo -iu myuser -l'`"]`}" aws ssm start-session --profile myprofile --target i-xxxxx --document-name my-bootstrap --parameters $jsonParams
方案三:用Start-Process显式调用AWS CLI
如果上面的方法还是不行,试试用PowerShell的Start-Process来绕开默认的参数解析逻辑:
$fullCommand = 'ssm start-session --profile myprofile --target i-xxxxx --document-name my-bootstrap --parameters {"command":["bash -lc ''sudo -iu myuser -l''"]}' Start-Process -FilePath aws.exe -ArgumentList $fullCommand -NoNewWindow -Wait
这里注意:JSON里的单引号要用两个单引号来转义(PowerShell字符串内部单引号的转义规则),整个命令参数作为一个字符串传递,让Start-Process直接把参数传给aws.exe,避免PowerShell拆分参数。
我之前也遇到过类似的问题,这几个方案里至少有一个能解决你的问题,先试试第一个,绝对最省心!
内容来源于stack exchange
相关产品推荐
相关产品推荐

