1. 程式人生 > >shell下在while迴圈中使用ssh命令的問題

shell下在while迴圈中使用ssh命令的問題

最近遇到一個很奇怪的問題,產品的某個功能可以根據日誌檔案的異常紀錄,去處理這些異常,不過在測試的時候發現每次都只能處理一條異常,然後整個迴圈就退出了。

開始以為是某個函式裡面呼叫了exit命令,看了一整遍程式碼也沒有發現使用exit的函式。最後只好在while迴圈裡面一點一點的註釋,然後觀察執行結果。最後竟然定位到是在一個函式裡面,呼叫了另外一個shell檔案,而且這個shell檔案裡的某個函式只要一執行,就會導致迴圈退出,然後定位到是一條ssh命令導致的。

搞不通ssh命令為什麼會導致shell退出,最後上網搜了一下才找到答案。

1. ssh命令在每次執行時,會讀取所有的標準輸入中的內容。

2. 對於while迴圈,當按照如下方式使用時:

    cat file | while read line

    這裡使用重定向,將檔案內容輸入到while命令,while命令每次使用read從輸入中讀取一行資料。

問題就在這裡,如果在while迴圈中呼叫了ssh命令,那麼ssh就會把當前輸入中所有的資料讀走,也就是cat file重定向給while命令的資料,都被ssh命令讀走了,以至於下次迴圈的時候,read讀到的內容為空,導致迴圈提前結束。

解決這個問題兩種方式

1. ssh -n 使用-n引數

2. ssh xxxx < /dev/null重定向shell命令的輸入