Как исправить этот цикл, который выполняет удаленную команду, используя 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
- первое эхо вернет 1, 2, 3, 4
- однако второе эхо вернет 4, 4, 4, 4
Ожидайте: оба должны вернуть 1,2,3,4
1 ответ
ws ssm send-command --document-name "AWS-RunShellScript" --instance-ids $instance_id \ --parameters '{"commands":["count=4; для i в { 1..$count }; сделать echo $i; ssh $(server_$i) bash -c '"'echo $i && echo $(дата +%Y-%m-%d)'"'; done;"],"executeTimeout":["3600"]}' \ - Тайм-аут 600 секунд - Регион США-Запад-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"]}'
здесь, в командной строке, это чувствуется так:
Часть 1:'{"команды": ["count = 4; для i в { 1..$count }; сделайте echo $ i; ssh $ (server_ $ i) bash -c' Часть 2: "'echo $i && echo $(дата +% Y-% m-% d)'" Часть 3: '; сделано; "]," ExecutionTimeout":["3600"]}"
Теперь вы можете видеть, почему это всегда 4.
В части 2 $ i раскрывается напрямую. После того, как вы выполнили цикл, здесь ваш $ i не является локальным, а после вашего выполнения (может не с первого раза успешно) вы $i=4 в вашей оболочке.