shell 腳本中while 循環只執行一次的問題

自己寫的一個獲取所有遠程服務器數據庫啓動配置信息的bash 腳本,發現循環裏的ssh遠程命令只能執行一次,感覺很奇怪,以前沒這麼使用過,

我的腳本爲

#!/bin/bash
## generate a separated line
for i in `seq 0 80`
    do
        vv+="#"
    done
#echo $vv;exit
##
cat myhost.txt|while read host 
do 
echo -e "$host\n"
ssh -q -n brucetam@$host "/sbin/chkconfig --list|grep -E \"mysql|mongo\""
#echo -e "###############\n"
        echo -e "$vv\n"
done

網上查詢資料如下爲參考資料,轉載過來當做筆記


以前寫過一個批量ssh的腳本,來批量處理一些東西,不過遇到過一個問題就是while循環只執行一次就退出。

現在又有人問到,就順便記錄一下,測試腳本如下

while read line ;

do 

ssh  -p20002 $line  -o StrictHostKeyChecking=no xxxxxxxxx

done < ip.txt

其中ip.txt裏是需要修改東東的ip列表,每次執行都只執行一次很”奇葩“。以前也不明白後來一個sys哥們他告訴我使用-n可以解決。

不過他說不清爲啥,後來自己 man ssh 發現 -n有如下解釋:


 -n      Redirects stdin from /dev/null (actually, prevents reading from stdin).  This must be used when ssh is
             run in the background.


具體意思是說, -n 使得ssh 使的標準輸入重定向爲/dev/null,否則的話ssh會讀取標準輸入(但是對ssh來說,讀取標準輸入的內容並沒有什麼用處)

結合-n 參數解釋剛剛說的while 執行一次的問題:

while 第一次從標準輸入讀取ip.txt 一行開始執行循環 然後執行到ssh ,這個時候ssh 會讀取標準輸入的所有內容但沒任何作用,執行完後依然執行while

循環,這個時候while read line 想讀取標準輸入的內容,發現已經沒有任何內容,故退出這就是我們看到的while只讀取一次的原因。


ps:上述分析純屬個人理解,如有誤導,實屬巧合。

本文轉自http://blog.csdn.net/lidan3959/article/details/20452717

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