shell中使用while循環ssh時只循環第一行的問題解決

需要讀取一個文本,次文本每一行包含一個IP在while循環中使用ssh,但ssh完第一行後就退出了,如何避免自動讀取一行就跳出while循環,此文將詳細解釋其原因。

   最近在寫一個自動更新的shell,可是發現如果在使用while循環從一個文件中讀取ip地址,然後訪問就只能讀取第一行紀錄。代碼如下:

1whilereadLINE
2do
3echo*******************************************$LINE
4ssh192.168.10.233 ls
5done< data

但是如果使用for就沒有這個問題,非常的奇怪,for的代碼如下:
1forLINE in`catdata`
2do
3echo*******************************************$LINE
4ssh192.168.10.233 ls
5done


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

1whileread LINE
2do
3echo *******************************************$LINE
4ssh 192.168.10.233cat
5done < data

執行這個shell就會發現,ssh中的cat語句會打印出data文件中的其他紀錄,這就導致調用玩ssh語句後,輸入緩存中已經都被讀完了,當read語句再讀的時候當然也就讀不到紀錄,循環也就退出了。改進方法是,將ssh的輸入重定向輸入:
1whilereadLINE
2do
3echo*******************************************$LINE
4ssh192.168.10.233 ls< /dev/null
5done< data
這樣,在while語句中也能順利的執行ssh語句了。linux的重定向還真複雜。

轉載自:http://leeon.me/a/shell-while-ssh

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章