2016-11-11 13 views
-1

私は以下の点に対処する必要があります。シェルスクリプト - ループ/ファイル読み込みが動作しないとき

  1. 私はIPアドレスのリストを含むファイルを持っています。私は行ごとに読みたいです。各IPに対して
  2. 私は私のコードです続き

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

(すべてはMikrotikデバイスである)SSHを使用して、以下のコマンドをプッシュする必要があります。

#!/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 

問題:ループは一度だけ実行されますが、これまでどのような変化が、私がやっています。

トラブルシューティング/観察: SSHコマンドを使用しないで、Whileループを実行してファイル "branch"を読み取ると正常に動作します。

+0

'sshpass'を使用しないでください! * ''公開鍵認証 '' * doeがどのように動作するか理解してください! (Nota: 'sshpass'があなたの奇妙な問題の原因かもしれません) –

+0

あなたの入力ファイルに空白行がありますか? – cdarke

答えて

0

問題は、ループ内のプログラムも標準入力でデータを読み取ることです。これは、"$filename"の2行目以降を消費します。 ループの次の反復では、読み込みに何も残らず、ループが終了します。

解決策は、stdinを読み取るコマンドを識別することです(恐らくsshpass)。stdinだけを残すように変更します。 Cyrusの答えは、sshのための1つの方法を示しています。それでも解決しない場合は、別の解決策

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

を試してみてくださいforループでwhileを交換することです。これは、branchファイルにIPアドレスしか含まれていない限り動作します。

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

ありがとうございました:) :)解明することの1つ...私はあなたが意味するものを知る必要があります。 "**問題は、ループ内のプログラムが標準入力のデータも読み込むということです。 "$ filename"にあるものの行。ループの次の反復では、読み込みに何も残っておらず、ループは終了します。** " – methz

+0

これは、同じ標準入力から読み取られた' read'と 'sshpass'つまり、 '' $ filename ''からです。最初に 'read'が来ると、filenameの最初の行が読み込まれます。 sshpassが来て、残りの行をすべて読み込みます。次に、次の 'read'はループを読み取って終了するだけです。 – Jens

関連する問題