1 現象描述
最近使用ssh批量執行命令(已經做了密鑰互信了),腳本讀取配置文件中的主機列表(內容為每行一台主機IP地址),然后執行,可是每次只是執行第一台,就退出循環了。
2 排查思路
由於腳本比較簡單,只是讀取主機,然后ssh而已,所以問題應該出現在ssh上
3 確定問題
搞不通ssh命令為什么會導致shell退出,最后上網搜了一下才找到答案。
ssh命令在每次執行時,會讀取所有的標准輸入中的內容。
對於while循環,當按照如下方式使用時:
while read Line do echo $Line done < $filename
這里使用重定向,將文件內容輸入到while命令,while命令每次使用read從輸入中讀取一行數據。
問題就在這里,如果在while循環中調用了ssh命令,那么ssh就會把當前輸入中所有的數據讀走,也就是重定向給while命令的數據,都被ssh命令讀走了,以至於下次循環的時候,read讀到的內容為空,導致循環提前結束。
4 處理結果
解決這個問題兩種方式
- 使用ssh的-n參數:用/dev/null來當ssh的輸入,阻止ssh讀取本地的標准輸入內容。
- ssh xxxx < /dev/null 重定向shell命令的輸入