运行Vagrant SSH会导致BASH循环过早终止

时间:2016-02-23 19:44:08

标签: linux bash shell ssh vagrant

我有一个bash脚本,用于获取运行的selenium节点,获取其ID以及SSH以执行配置任务。

#!/bin/bash

# retrieve list of running vagrant machines, filter them to selenium nodes, and
# process provisioning for each
vagrant global-status --prune | grep "selenium_node" | while read -ra line ; do
    echo -e "\033[32mBEGININNG ${line[1]} PROVISIONING\033[37m"

    # adding this statement causes the loop to exit after 1 iteration
    vagrant ssh ${line[0]} -- "
        echo 'it runs'
    "

    echo -e "\033[32mEND ${line[1]} PROVISION\033[37m"
done

我的问题是运行vagrant ssh会导致循环在第一次迭代后终止。我通过删除流浪汉ssh'来证实这一点。结果是每次迭代都成功运行 BEGINNING END echo命令(在我的情况下 - 两次迭代)。

陌生人的意思是循环完成它的第一次迭代(由 END 回声线完成所证明),它只是不再运行迭代。

此外,我已经确认它不仅仅是忽略了显示其他迭代的输出。它永远不会在其他机器上执行任何操作。

1 个答案:

答案 0 :(得分:1)

ssh - 包括vagrant ssh - 消耗标准输入,因此如果您在while read循环内运行它,它将不会为下一个循环迭代留下任何内容。

您可以通过告诉ssh不要阅读标准输入(ssh -n)或使用与while read不同的结构来解决此问题。在这种情况下,由于vagrant ssh不支持-n选项,我建议使用从/dev/null重定向的输入来运行它:

</dev/null vagrant ssh ${line[0]} -- "
    echo 'it runs'
"