今天聽到同事,說了while和ssh連用的從定向問題,然後baidu了下,特此總結。
詳見:http://blog.csdn.net/shrekmu/article/details/2513177
for循環中,沒有此問題。
原因:while循環中,使用了重定向機制,被讀取文件中的信息都已經讀入並重定向給了整個while語句。所以當我們在while循環中再一次調用read語句,就會讀取到下一條記錄。問題就出在這裏,ssh語句正好讀取輸入的所有信息。
解決辦法:在while循環中的ssh語句的最後,加上< /dev/null,即可。
格式:
cat file|while read LINE do echo ********************************$LINE ssh $LINE cat </dev/null done |
實例1:常見的錯誤
[root@ tmp]# cat date 172.21.34.20 172.21.34.23 172.21.34.22
[root@ tmp]# vi while_ssh.sh
#!/bin/bash while read LINE do echo ********************************$LINE ssh $LINE cat done < date
[root@ tmp]# sh -x while_ssh.sh + read LINE + echo '********************************172.21.34.20' ********************************172.21.34.20 + ssh -p 10060 172.21.34.20 cat 172.21.34.23 172.21.34.22 + read LINE |
實例2:解決辦法
[root@ tmp]# cat date 172.21.34.20 172.21.34.23 172.21.34.22
[root@ tmp]# vi while_ssh.sh
#!/bin/bash while read LINE do echo ********************************$LINE ssh $LINE cat </dev/null done < date
[root@ tmp]# sh -x while_ssh.sh + read LINE + echo '********************************172.21.34.20' ********************************172.21.34.20 + ssh -p 10060 172.21.34.20 cat + read LINE + echo '********************************172.21.34.23' ********************************172.21.34.23 + ssh -p 10060 172.21.34.23 cat + read LINE + echo '********************************172.21.34.22' ********************************172.21.34.22 + ssh -p 10060 172.21.34.22 cat + read LINE |