我有一个带有 while 循环的简单脚本,但无法理解为什么它在 $vault_list 变量的第一行之后中断:
#!/bin/bash
tech_login="$1"
vault_list=$(docker exec -i tmgnt_vault_1 vault list secret/${tech_login}-terminals | sed 1,2d)
while IFS= read -r terminal
do
echo "line is $terminal"
key_values=$(docker exec -i tmgnt_vault_1 vault read secret/${tech_login}-terminals/$terminal )
done <<< "$vault_list"
如果我从 while 循环中删除 $key_values,它会返回 echo“line is $terminal”中的所有值。 谁能指出我, while 循环有什么问题?我认为这可能是输出问题,但不确定。
希望这对其他人有帮助。
ssh 可能是正在使用 stdin 的命令。
这是给我的。
例如while 循环内的 ssh 导致循环在第一次迭代后退出。
LIST="cid1 10.10.0.1 host1
cid2 10.10.0.2 host1
cid3 10.10.0.3 host2"
# this while loop exits after first iteration
# ssh has eaten rest of stdin
echo "$LIST" |while read -r cid cip chost; do
echo $cid;
PSINFO=$(ssh $chost docker exec -i $cid "ps -e -orss=,pid=,args=,cmd=" |grep java );
echo PSINFO=$PSINFO;
done;
通过指示 ssh 使用 从 /dev/null 获取标准输入来解决:
# this while loop keeps on running
# ssh directed to take stdin from /dev/null
echo "$LIST" |while read -r cid cip chost; do
echo $cid;
PSINFO=$(ssh $chost docker exec -i $cid "ps -e -orss=,pid=,args=,cmd=" </dev/null |grep java );
echo PSINFO=$PSINFO;
done;
根据 @choroba 的提示,我找到了 $key_values 的正确语法:
key_values=$(docker exec -i tmgnt_vault_1 vault read secret/${tech_login}-terminals/$terminal <<<$terminal)
我需要将 $terminal 变量显式传递给 docker 命令,这可以使用此处字符串“<<
与
aws ecs execute-command
有同样的问题。 While 循环在第一次执行后立即被中断。不幸的是,它没有 -n
标志,但是 < /dev/null
的技巧有所帮助。
因此,为集群中的每个任务运行命令的正确方法是:
$ aws ecs list-tasks --cluster prod-cluster --service prod-service --region prod-region \
| grep arn:aws:ecs:prod-region \
| sed 's_.*/__g;s/[",]//g' \
| while read task; do
echo $task;
aws ecs execute-command --cluster prod-cluster --task ${task} --container prod-image --command "uptime" --interactive < /dev/null \
| grep 'load average';
done
它将显示
uptime
当前在集群中运行的所有任务