今天碰到一個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 禁用僞終端配置linux
而最後一行讀不到的緣由也很奇葩,由於是最後一行沒有回車到下一行shell
這些小問題糾結我一天!!!緩存