【问题标题】:Running Vagrant SSH causes BASH loop to terminate prematurely [duplicate]运行 Vagrant SSH 会导致 BASH 循环过早终止 [重复]
【发布时间】:2016-02-23 19:44:07
【问题描述】:

我有一个 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 会导致循环在第一次迭代后终止。我通过删除 'vagrant ssh' 确认了这一点,结果是 BEGINNINGEND echo 命令在每次迭代中都成功运行(在我的情况下 - 两次迭代)。

奇怪的是,循环确实完成了它的第一次迭代(正如 END 回显线完成所证明的那样),它只是没有运行任何进一步的迭代。

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

【问题讨论】:

    标签: linux bash shell ssh vagrant


    【解决方案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'
    "
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-20
      • 2016-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-17
      • 1970-01-01
      • 2011-10-28
      相关资源
      最近更新 更多