2017-02-16 1 views
0

ちょっとした背景、私は新しい行を区切って1000個のサーバーを持つファイルを持っています。私はそれらをSSH上で約5つのコマンドを実行するアレイに読み込まなければなりません。私はheredoc表記を使っていますが、それは失敗するようです。現在、ホストが認識されないというエラーが表示されます。配列をbashのsshに移入する

IFS='\n' read -d '' -r -a my_arr < file 
    my_arr=() 
    for i in "${my_arr[@]}"; do 
      ssh "$1" bash -s << "EOF" 
      echo "making back up of some file" 
      cp /path/to/file /path/to/file.bak 
      exit 
    EOF 
    done 

私は、最初のサーバがリストされた出力を取得しますが、その後はアレイのすべての出力も表示します。私はこれを引き起こすSTDINのリダイレクトがないことを知っています。

ありがとうございました。

+0

あなたのスクリプトには、反復処理されるアイテム以外の '$ i'はありません。 '$ 1'ではなく' $ i'を使いますか? –

+0

...明らかであるように、これはsshやheredocsとは何も関係ありません。あなたは他のコマンドでもまったく同じ問題を抱えています - '$ {my_arr [@]} 'のiのために; echo "$ 1"; 「済」は同じように失敗する。 –

+0

ところで、 'declare -p my_arr'を使ってその内容を明白に表示して、配列が実際に正しく読み込まれているかどうかの質問に答えます。 –

答えて

2

アレイが必要ですか?何が問題である:

while read -r host 
do 
    ssh "$host" bash -s << "EOF" 
    echo "making back up of some file" 
    cp /path/to/file /path/to/file.bak 
EOF 
done < file 
+0

これは予期せぬ構文エラーを引き起こします。 – zinnadean

+0

ループ内のEOFを使用すると、ファイルが終了します。あなたは何かを使うことができるので、私はそれをENDに変更しました。これにより問題が解決されます。 – zinnadean

+2

@zinnadean、文字列 'EOF' *は、ファイル自体が同じsigilを使ってより大きいheredocに囲まれていない限り、ファイルを終了させません。要するに、あなたの質問に余分な文脈が含まれていない場合にのみ、その問題が発生する可能性があります。 –

0

明確にするために - ここでの問題、そしては実際にあなたの質問に含まれるコード中に存在する唯一のの問題は、あなたがあなたのループ内$1を使用しているということですループの各呼び出しで反復される項目を含む変数として$iを指定しました。

つまり、ssh "$1"の代わりにssh "$i"が必要です。

+0

私はそれを転記したときには誤りでした。それは "$ i"でなければなりません。 – zinnadean

+0

元のコードは、それ自体では問題ありません。あなたのバグは、あなたが質問で提供しなかったコードのコンテキストでのみ起こるものです。 –