如何在while和for中使用ssh

2021-04-18 03:25:43 字數 1136 閱讀 1856

最近在寫乙個自動更新的shell,可是發現如果在使用while迴圈從乙個檔案中讀取ip位址,然後訪問就只能讀取第一行紀錄。**如下:

while read line

doecho *******************************************$line

ssh 192.168.10.233 ls

done < data

但是如果使用for就沒有這個問題,非常的奇怪,for的**如下:

for line in `cat data`

doecho *******************************************$line

ssh 192.168.10.233 ls

done

難道for和while竟然有這麼大的差別,不可能吧。經過一番試驗以後發現,原來並不是while的for的差別,而是while中使用重定向機制,data檔案中的資訊都已經讀入並重定向給了整個while語句。所以當我們在while迴圈中再一次呼叫read語句,就會讀取到下一條記錄。問題就出在這裡,ssh語句正好回讀取輸入中的所有東西,下面這個shell能很好的說明這個問題:

while read line

doecho *******************************************$line

ssh 192.168.10.233 cat

done < data

執行這個shell就會發現,ssh中的cat語句會列印出data檔案中的其他紀錄,這就導致呼叫玩ssh語句後,輸入快取中已經都被讀完了,當read語句再讀的時候當然也就讀不到紀錄,迴圈也就退出了。改進方法是,將ssh的輸入重定向輸入:

while read line

doecho *******************************************$line

ssh 192.168.10.233 ls < /dev/null

done <  data

這樣,在while語句中也能順利的執行ssh語句了。linux的重定向還真複雜。

附錄:測試用的data檔案

line1

line2

line3

line4

現在插入的**怎麼不能換行阿!

如何在Linux中使用at和crontab命令

經驗豐富的系統運維工程師可以使得linux在無需人為介入的情況下,在指定的時間段自動啟用或停止某些服務或命令,從而實現運維的自動化。儘管我們現在已經有了功能彪悍的指令碼程式來執行一些批處理工作,但是,如果仍然需要在每天凌晨兩點敲擊鍵盤回車鍵來執行這個指令碼程式,這簡直太痛苦了 當然,也可以訓練您的小...

如何在AndroidStudio中使用AIDL

本章節介紹如何在androidstudio中使用aidl 2.在aidl下建立乙個包,包裡建立乙個 aidl檔案,右鍵aidl new aidl aidl file 紅框就是建立完成後的樣子 3.在aidl檔案寫要被呼叫的方法,此方法不能有許可權修飾符 4.首先build下,然後建立乙個servic...

如何在Oracle中使用Sequence

sql server可以自增字段,但是oracle中在建表的時候可沒有這個選項,但是可以通過觸發器 trigger 或者序列 sequence 來實現,本文主要講述sequence。二者的區別oracle中自增字段的兩種方法的比較 trigger和sequence 建立sequence的語法很簡單,...