bash脚本中EOF导致while循环仅执行首次迭代的问题排查
问题原因与解决办法
你的脚本只处理第一行的核心问题是:ssh命令会默认读取标准输入(stdin),而你的while循环正是通过stdin从file.dat读取行内容。当第一次循环执行ssh时,它会把file.dat里剩下的所有行都当作自己的输入吃掉,导致while循环没有后续行可以读取,直接终止。
给你三个可行的解决办法:
方法一:用ssh的
-n参数
这个参数会让ssh从/dev/null读取输入,不再占用循环的stdin。修改后的ssh命令如下:ssh -n root@${ipaddress} <<-EOF ... ... EOF方法二:重定向ssh的输入到
/dev/null
在ssh命令里明确将输入重定向到空设备,同样可以避免抢占循环的输入流:ssh root@${ipaddress} <<-EOF < /dev/null ... ... EOF方法三:使用独立的文件描述符读取
file.dat
给while循环单独分配一个文件描述符(比如3)来读取file.dat,这样ssh就不会干扰到循环的输入源:while IFS= read -r line <&3 do # 假设line就是ipaddress,根据实际情况调整 ipaddress="$line" ssh root@${ipaddress} <<-EOF ... ... EOF echo done with ${ipaddress} done 3< file.dat
内容的提问来源于stack exchange,提问作者Miss_Orchid
相关产品推荐
相关产品推荐

