今天碰到乙個ssh的問題,google之。原因如下:
需要讀取乙個文字,次文字每一行包含乙個ip在while迴圈中使用ssh,但ssh完第一行後就退出了,如何避免自動讀取一行就跳出while迴圈,此文將詳細解釋其原因。
最近在寫乙個自動更新的shell,可是發現如果在使用while迴圈從乙個檔案中讀取ip位址,然後訪問就只能讀取第一行紀錄。**如下:
1
while
read
line
2
do
3
echo
*******************************************$line
4
ssh
192.168.10.233
ls
5
done
< data
但是如果使用for就沒有這個問題,非常的奇怪,for的**如下:
1
for
line
in
`
cat
data`
2
do
3
echo
*******************************************$line
4
ssh
192.168.10.233
ls
5
done
難道for和while竟然有這麼大的差別,不可能吧。經過一番試驗以後發現,原來並不是while的for的差別,而是while中使用重定向機制,data檔案中的資訊都已經讀入並重定向給了整個while語句。所以當我們在while迴圈中再一次呼叫read語句,就會讀取到下一條記錄。問題就出在這裡,ssh語句正好回讀取輸入中的所有東西,下面這個shell能很好的說明這個問題:
1
while
read line
2
do
3
echo
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
$line
4
ssh
192.168
.
10.233
cat
5
done < data
執行這個shell就會發現,ssh中的cat語句會列印出data檔案中的其他紀錄,這就導致呼叫玩ssh語句後,輸入快取中已經都被讀完了,當read語句再讀的時候當然也就讀不到紀錄,迴圈也就退出了。改進方法是,將ssh的輸入重定向輸入:
1
while
read
line
2
do
3
echo
*******************************************$line
4
ssh
192.168.10.233
ls
< /dev/null
5
done
< data
這樣,在while語句中也能順利的執行ssh語句了。linux的重定向還真複雜。
原文:
關於用Getline讀取檔案只能讀取首行的問題
自己再 中用getline讀取檔案時只能讀取首行,這個問題困擾了我很久,最開始我以為是函式沒有識別換行,任然再第一行讀取東西,但這個行getline這個函式的基本功能就相悖了,在稍作測試後我就換了其他思路,轉向其他方向。void readman list m,char filename int ar...
InputStream只能讀取一次的解決方法
有時候我們需要對同乙個inputstream物件使用多次。但第一次讀取inputstream物件後,第二次再讀取時可能已經到stream的結尾了 eofexception 或者stream已經close掉了。而inputstream物件本身不能複製,因為它沒有實現cloneable介面。此時,可以先...
當while遇到重定向 sh的陷阱
最近寫指令碼遇到乙個變數在while迴圈中重定向後丟掉的問題,經過幾番查詢,發現解決辦法,分享如下。以下內容來自網路。以下是我在程式設計時的親身體會 先看如下的程式 bin sh count 0 while read line docount expr count 1 done file echo ...