在循环中调用ssh命令时,bash循环中断

时间:2019-05-12 14:13:42

标签: bash ssh

下面的脚本将在第一个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

2 个答案:

答案 0 :(得分:1)

在ssh中添加选项-n,以停止从stdin读取。


请参阅:man ssh

答案 1 :(得分:1)

使用数组而不是字符串,因此您只是在遍历数组内容,而不是依赖于能够从stdin读取的内容:

file_list=(
aaa
bbbb
ccccc
dddddd
eeeeeee
)

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

为了使Google更加健壮,如何最好地用换行符分隔的字符串列表填充数组(请查找readarraymaparrayIFS=$'\n'-我不记得了头顶上出现了“最好的”咒语。