2017-11-27 10 views
-1

私は、サーバーのリストをSSHで自動化してデータを収集したいと考えています。Forループを使用するとSSHセッションがハングする

今すぐセッションがmsgで始まります。 "stdinは端末ではないため、疑似端末は割り当てられません。"遠隔サーバーに接続されることなく継続されます。

SSH回線から '-n'を削除すると、SSHセッションが切断されるまで、リモートサーバに接続してスクリプトの実行を停止します。

for host in $(cat host_list); 
    do 
     ssh -n -o stricthostkeychecking=no $host 
     var1=$(awk -F '.' '{print $1}' some_file) 
     var2=$(some_command $var1) 
     echo $var2 
    done 

オリジナルポスト(コンテキストのために必要であれば): Data Extrapolation & Bash Logic within Expect Script

+1

私は少しこのスクリプトがやろうとしているもの困惑しています。 '$()'のコマンドをリモートマシン上で実行しますか? –

+0

はい、正しいです。 – Mark

+0

ループを忘れて、リモートホストで実行したいコマンドを表示してください。 'some_file'と' some_command'がローカルにあるかリモートホストにあるのかを教えてください – markp

答えて

-1

それは何あなたが望むことは、リモートファイルから情報を取得し、その後、いくつかの処理を行うことであるように見えます。

cmd="awk -F '.' '{print $1}' some_file" for host in $(cat host_list); do var1=$(ssh -o stricthostkeychecking=no $host $cmd) var2=$(some_command $var1) echo $var2 done

+1

なぜコマンドを変数に入れていますか?適切なクォートやエスケープがなければ、 'cmd'の値には、Awkスクリプトのリテラル文字列' $ 1'ではなく、現在のスクリプトの*値が* $ 1に含まれます。より一般的には、https://stackoverflow.com/questions/10067266/when-to-wrap-quotes-around-a-shell-variableを確認する必要があります。 – tripleee

0

あなたが代わりにwhileループを使用しuseless use of cat award

を得た:何をする必要がありますことのようにsshからawkコマンドを実行しています。また、ローカルで展開を避けるために、リモートで実行したいawkプログラム内部のドル記号をエスケープすることを忘れてはいけない: -

while read host 
do 
     ssh -n -o StrictHostKeyChecking=no $host "awk -F'.' '{ print \$1 }' some_file" 

done < host_list 
関連する問題