2016-11-11 82 views
-1

我有一個要求,應該解決以下幾點。Shell腳本 - 雖然循環/文件讀取不工作

  1. 我有一個包含IP地址列表的文件,我想逐行閱讀。
  2. 對於每個IP,我需要使用SSH來推動下面的命令(全部爲設備的MikroTik)

    /radius add service=login address=172.16.0.1 secret=aaaa 
    /user aaa set use-radius=yes 
    

以下是我的代碼。

#!/bin/bash 

filename="branch" 

while IFS= read line; do 

     echo ${line//} 
     line1=${line//} 
     ok='@' 
     line3=$ok$line1 

     sshpass -p abc123 ssh -o StrictHostKeyChecking=no admin$line3/radius add service=login address=172.16.0.1 secret=aaaa 
     sleep 3 
     sshpass -p abc123 ssh -o StrictHostKeyChecking=no admin$line3/user aaa set use-radius=yes 
     sleep 3 
     echo $line3 
     echo $line 
done <"$filename" 

分公司文本文件:

192.168.100.1 

192.168.101.2 

192.168.200.1 

問題:什麼都我做的變化,而循環只運行一次。

故障排除/觀察: 如果我運行While循環來讀取文件「分支」,沒有SSH命令它工作正常。

+0

不要使用'sshpass'!首選理解*''公鑰認證''* doe的工作方式! (注意:'sshpass'可能是你奇怪問題的原因) –

+0

當你顯示輸入文件時是否有空行? – cdarke

回答

0

問題是循環中的程序也讀取標準輸入上的數據。這將消耗"$filename"中的第二行和後續行。 在循環的下一次迭代中,沒有剩下可讀的內容,循環終止。

解決方案是識別命令讀取標準輸入,可能是sshpass並將其更改爲僅保留stdin。賽勒斯的答案顯示了一種方法來做到這一點ssh。如果還是不行,請嘗試

sshpass [options and arguments here] < /dev/null 

另一種解決方案是用for循環更換while。這個工作只要branch文件只包含IP地址:

for ip in $(cat branch); do 
    echo $ip 
    ... 
    sshpass ... 
done 
+0

感謝您的解釋:) :)澄清一件事...我需要知道你的意思是什麼「**問題是循環中的程序也讀取標準輸入數據,這將消耗第二個和後續「$ filename」中的內容在循環的下一次循環中,沒有什麼可以讀取和循環終止**「 – methz

+0

這意味着'read'和'sshpass'都從同一個標準輸入,即從'「$ filename」'。首先是'read',它讀取文件名中的第一行;然後是sshpass,它讀取所有其餘的行。然後下一個'讀'沒有更多的閱讀和終止循環。 – Jens