while read line只讀一行或者最後一行讀不到

  今天碰到一個ssh的問題,google之。緣由以下:
須要讀取一個文本,次文本每一行包含一個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 i in data;
do
echo *******************************************$LINE
ssh 192.168.10.233 ls 
done < data
難道for和while居然有這麼大的差異,不可能吧。通過一番試驗之後發現,原來並非while的for的差異,而是while中使用重定向機制,data文件中的信息都已經讀入並重定向給了整個while語句。因此當咱們在while循環中再一次調用read語句,就會讀取到下一條記錄。問題就出在這裏,ssh語句正好回讀取輸入中的全部東西,下面這個shell能很好的說明這個問題: 
while read line;
do
echo *******************************************$LINE
ssh 192.168.10.233 ls 
done < data

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



其實還有更加簡單的方法就是:在while read line時,使用ssh 的時候加入參數 -n

ssh 參數詳解:

主要參數說明:

-l 指定登入用戶

-p 設置端口號

-f 後臺運行,並推薦加上 -n 參數

-n 將標準輸入重定向到 /dev/null,防止讀取標準輸入

-N 不執行遠程命令,只作端口轉發

-q 安靜模式,忽略一切對話和錯誤提示

-T 禁用僞終端配置linux

 

而最後一行讀不到的緣由也很奇葩,由於是最後一行沒有回車到下一行shell

 

這些小問題糾結我一天!!!緩存

相關文章
相關標籤/搜索