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 禁用偽終端配置

 

而最后一行讀不到的原因也很奇葩,因為是最后一行沒有回車到下一行

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM