while read line 程式碼中呼叫 ssh 檔案重定向問題.

babyyellow發表於2017-04-07
需要隊部分主機做批次ssh 上去做遠端檢測. 


程式碼就很簡單.  

while  read line 
do
  xxxxxx 資料清洗. 

ssh   $line    $COMMAND  

done

 程式碼本身沒有什麼問題. 很簡單. 
但是在執行的時候, 出問題了.

ssh 只能執行第一個 ip 地址,然後就退出了.  退出狀態也是正常的. 說明沒有報錯. 


問題出在哪裡呢? 


經過一番搜尋 google . 

原來是 原來 while  read line  會吧內容全部讀到快取裡面.   

然後內  ssh  是從stdin 裡取資料. 


最後就導致了 ssh  第一個ip  以後, 順便把 read line 剩下的內容都給讀取完了.  

read line  第二次讀取的時候, 已經沒東西可以讀了, 到了檔案末尾 EOF 裡, 自然就 退出了. 這也驗證了,我們的程式碼是正常退出沒有報錯.


怎麼辦呢,  對ssh 進行重定向, 阻止從stdin 讀取. 


ssh  的引數 -n  或者 -f  或者 -n-f  都可以重定向.  或者 ssh    </dev/null 都行了. 


那麼程式碼修改為  : 

while  read line 
do
  xxxxxx 資料清洗. 

ssh   $line    $COMMAND   </dev/null  

或者 ssh  -n  $line  $COMMAND  

done


那麼這個問題的本質原因是什麼呢? 


相信大家 可能都已經忘記了.  


< linux  環境 高階程式設計 >  裡面講的很清楚了. 

子程式 繼承了父程式的 環境變數,  檔案描述符等等.     所以這個問題的本質就是  子程式 繼承了父程式的檔案描述符, 然後把父程式的檔案給讀完了. 導致父程式沒有東西讀. 


其實 while  do read line  中如果呼叫  其他的 從stdin 讀取命令 都會有這個問題. 
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/133735/viewspace-2136798/,如需轉載,請註明出處,否則將追究法律責任。

相關文章