如何修复使用 ssh 执行远程命令的循环
How to fix this loop that execute remote command using ssh
我正在使用 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
- 第一个 echo 会 return 1, 2, 3, 4
- 但是第二个 echo 会 return 4, 4, 4, 4
预期:两者都应该 return 1,2,3,4
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 了吗?
part2中$i是直接展开的。在你执行循环之后,这里你的 $i 不是本地的,并且在你执行之后(第一次可能不成功),你现在在你的 shell 中 $i=4 。
我正在使用 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
- 第一个 echo 会 return 1, 2, 3, 4
- 但是第二个 echo 会 return 4, 4, 4, 4
预期:两者都应该 return 1,2,3,4
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 了吗?
part2中$i是直接展开的。在你执行循环之后,这里你的 $i 不是本地的,并且在你执行之后(第一次可能不成功),你现在在你的 shell 中 $i=4 。