如何修复使用ssh执行远程命令的循环

时间:2018-12-29 07:15:11

标签: bash aws-ssm

我正在使用aws ssm执行操作任务。 当执行类似于以下命令(替换细节)时,变量i的值在远程执行中使用时设置不正确

我的代码有什么问题?

aws ssm send-command --document-name "AWS-RunShellScript" --instance-ids $instance_id \
    --parameters '{"commands":["count=4; for i in { 1..$count }; do echo $i; ssh $(server_$i) bash -c '"'echo $i && echo $(date +%Y-%m-%d)'"'; done;"],"executionTimeout":["3600"]}' \
    --timeout-seconds 600 --region us-west-2
  • 第一个回声将返回1、2、3、4
  • 但是第二个回显将返回4、4、4、4

期望:两者都应返回1,2,3,4

1 个答案:

答案 0 :(得分:1)

ws ssm send-command --document-name "AWS-RunShellScript" --instance-ids $instance_id \
    --parameters '{"commands":["count=4; for i in { 1..$count }; do echo $i; ssh $(server_$i) bash -c '"'echo $i && echo $(date +%Y-%m-%d)'"'; done;"],"executionTimeout":["3600"]}' \
    --timeout-seconds 600 --region us-west-2

让我们逐步分解您的命令。 首先,它包含一个长字符串参数:

--parameters '{"commands":["count=4; for i in { 1..$count }; do echo $i; ssh $(server_$i) bash -c '"'echo $i && echo $(date +%Y-%m-%d)'"'; done;"],"executionTimeout":["3600"]}' 在命令行中,感觉像这样:

Part1 :'{"commands":["count=4; for i in { 1..$count }; do echo $i; ssh $(server_$i) bash -c '

Part2: "'echo $i && echo $(date +%Y-%m-%d)'"

Part3: '; done;"],"executionTimeout":["3600"]}'

现在您可以看到为什么总是4。

在第2部分中,直接扩展$ i。执行完循环后,这里的$ i不是本地的,执行之后(可能不是第一次成功执行),现在$ i = 4在shell中。