【问题标题】:bash cycle breaks when calling ssh command in the loop在循环中调用 ssh 命令时 bash 循环中断
【发布时间】:2019-09-29 16:34:01
【问题描述】:

下面的脚本将在第一个 ssh 命令时中断。没有出错,而是打破了while循环。使用set -vx 调试脚本将表明read -r line 不会从被迭代的变量中读取任何其他内容。

一旦我注释掉 ssh 行,它就会正常工作并遍历整个循环。

你能帮忙解开这里的谜吗?

谢谢!

脚本:

#!/bin/bash
set -vx
file_list=$(cat <<EOT
aaa
bbbb
ccccc
dddddd
eeeeeee
EOT
)

while read -r line; do
    echo ${line}
    ssh 192.168.100.222 touch /tmp/${line}
done <<< "${file_list}"

带有 ssh 行注释的输出(set -vx 被忽略)

aaa
bbbb
ccccc
dddddd
eeeeeee

启用 ssh 线路的输出

aaa

【问题讨论】:

  • 我还将 ssh 行更改为下面的行,它显示它正在执行,但 while 仍然中断:ssh 192.168.100.222 echo "1"

标签: bash ssh


【解决方案1】:

向 ssh 添加选项 -n 以停止从标准输入读取。


见:man ssh

【讨论】:

  • 谜团解开了!所以 ssh 实际上正在吃掉所有其他的标准输入。感谢您澄清这一点。
【解决方案2】:

使用数组而不是字符串,这样您就可以循环遍历数组内容,而不是依赖能够从标准输入读取的内容:

file_list=(
aaa
bbbb
ccccc
dddddd
eeeeeee
)

for file in "${file_list[@]}"; do
    echo "$file"
    ssh 192.168.100.222 touch "/tmp/$file"
done

为了使它更健壮,谷歌如何最好地从换行符分隔的字符串列表中填充一个数组(查找 readarraymaparrayIFS=$'\n' - 我不记得“最佳”咒语了我的头顶)。

【讨论】:

  • 谢谢。它似乎运作良好。虽然这解决了我的直接问题,但我仍然有兴趣了解为什么像我最初的解决方案那样迭代会中断。
  • 因为您的循环和 ssh 都从标准输入读取,而标准输入来自 &lt;&lt;&lt; "${file_list}"
猜你喜欢
  • 2018-01-31
  • 2014-03-08
  • 1970-01-01
  • 2018-09-16
  • 2012-11-11
  • 2022-01-12
  • 2020-02-15
  • 1970-01-01
相关资源
最近更新 更多