天天看點

shell中使用while循環ssh的注意事項

需要讀取一個文本,次文本每一行包含一個IP在while循環中使用ssh,但ssh完第一行後就退出了,如何避免自動讀取一行就跳出while循環,此文将詳細解釋其原因。      最近在寫一個自動更新的shell,可是發現如果在使用while循環從一個檔案中讀取ip位址,然後通路就隻能讀取第一行紀錄。代碼如下: 

while read LINE 

do 

echo *******************************************$LINE 

ssh 192.168.10.233 ls 

done < data 

但是如果使用for就沒有這個問題,非常的奇怪,for的代碼如下: 

for LINE in `cat data` 

done 

難道for和while竟然有這麼大的差别,不可能吧。經過一番試驗以後發現,原來并不是while的for的差别,而是while中使用重定向機制,data檔案中的資訊都已經讀入并重定向給了整個while語句。是以當我們在while循環中再一次調用read語句,就會讀取到下一條記錄。問題就出在這裡,ssh語句正好回讀取輸入中的所有東西,下面這個shell能很好的說明這個問題: 

ssh 192.168.10.233 cat 

執行這個shell就會發現,ssh中的cat語句會列印出data檔案中的其他紀錄,這就導緻調用玩ssh語句後,輸入緩存中已經都被讀完了,當read語句再讀的時候當然也就讀不到紀錄,循環也就退出了。改進方法是,将ssh的輸入重定向輸入: 

ssh 192.168.10.233 ls < /dev/null 

這樣,在while語句中也能順利的執行ssh語句了。linux的重定向還真複雜。

參考博文:http://leeon.me/a/shell-while-ssh

     本文轉自1321385590 51CTO部落格,原文連結:http://blog.51cto.com/linux10000/1962890,如需轉載請自行聯系原作者

繼續閱讀