while read line 程式碼中呼叫 ssh 檔案重定向問題.
需要隊部分主機做批次ssh 上去做遠端檢測.
其實 while do read line 中如果呼叫 其他的 從stdin 讀取命令 都會有這個問題.
程式碼就很簡單.
while read line
do
xxxxxx 資料清洗.
ssh $line $COMMAND
done
程式碼本身沒有什麼問題. 很簡單.
但是在執行的時候, 出問題了.
ssh 只能執行第一個 ip 地址,然後就退出了. 退出狀態也是正常的. 說明沒有報錯.
問題出在哪裡呢?
經過一番搜尋 google .
原來是 原來 while read line 會吧內容全部讀到快取裡面.
然後內 ssh 是從stdin 裡取資料.
最後就導致了 ssh 第一個ip 以後, 順便把 read line 剩下的內容都給讀取完了.
read line 第二次讀取的時候, 已經沒東西可以讀了, 到了檔案末尾 EOF 裡, 自然就 退出了. 這也驗證了,我們的程式碼是正常退出沒有報錯.
怎麼辦呢, 對ssh 進行重定向, 阻止從stdin 讀取.
ssh 的引數 -n 或者 -f 或者 -n-f 都可以重定向. 或者 ssh </dev/null 都行了.
那麼程式碼修改為 :
while read line
do
xxxxxx 資料清洗.
ssh $line $COMMAND </dev/null
或者 ssh -n $line $COMMAND
done
那麼這個問題的本質原因是什麼呢?
相信大家 可能都已經忘記了.
< linux 環境 高階程式設計 > 裡面講的很清楚了.
子程式 繼承了父程式的 環境變數, 檔案描述符等等. 所以這個問題的本質就是 子程式 繼承了父程式的檔案描述符, 然後把父程式的檔案給讀完了. 導致父程式沒有東西讀.
其實 while do read line 中如果呼叫 其他的 從stdin 讀取命令 都會有這個問題.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/133735/viewspace-2136798/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- while read 迴圈中 呼叫ssh 遠端執行程式碼的一個超級大坑.While行程
- 【Linux shell】while read lineLinuxWhile
- Linux while 迴圈中使用ssh問題LinuxWhile
- while read line 與for迴圈的區別While
- 【shell】while read line 與for迴圈的區別While
- SSH中SQL命令退格亂碼問題SQL
- python中讀取檔案的read、readline、readlines方法區別Python
- [python]檔案操作read&readline&readlinesPython
- 【Vim】【man】【技巧】使用vim處理man重定向幫助檔案亂碼問題
- html檔案中的php程式碼被註釋掉的問題HTMLPHP
- 重建控制檔案與 datafile offline,tablespace read only
- 【SSH】--框架搭建錯誤及專案中問題框架
- Shell 重定向(一):檔案重定向
- vue中呼叫問題Vue
- 使用檔案重定向
- 解決SSH亂碼問題
- jsp中的rar檔案連線亂碼問題JS
- ssh,下載檔案遇到的埠號別篡改的問題
- 資料檔案offline後unusable索引造成的問題索引
- Linux 檔案重定向Linux
- ant指令碼呼叫.bat檔案指令碼BAT
- linux系統程式設計之檔案與IO(二):系統呼叫read和writeLinux程式設計
- Linux 重定向把錯誤輸出到檔案中Linux
- java -version重定向到檔案Java
- asp.net中引入外部js檔案的中文亂碼問題ASP.NETJS
- Java中Socket上的Read操作堵塞問題Java
- 在ASP檔案中呼叫DLL (轉)
- 檔案中隨機讀取行問題隨機
- XML檔案處理中增加xmlns問題XML
- 檔案存放問題
- 詳解SSH 框架中物件呼叫流程框架物件
- SSH連線Linux中文亂碼問題Linux
- 程式設計中對於檔案路徑應該注意的問題程式設計
- asp程式設計經驗談:ASP檔案中的安全問題(轉)程式設計
- 記一次奇怪的檔案控制程式碼洩露問題
- [提問交流]在Apache下重定向問題 /login 重定向到 /home/passport/login 有問題ApachePassport
- Java 讀檔案寫檔案 韓文 中文 亂碼問題解決方案Java
- Vue使用中遇到的程式碼問題Vue