Как исправить этот цикл, который выполняет удаленную команду, используя SSH - PullRequest
0 голосов
/ 29 декабря 2018

Я использую 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 голосов
/ 29 декабря 2018
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 в вашей оболочке.

...