シェルスクリプトのsshブロックの環境変数

シェルスクリプトのsshブロックの環境変数

私は次の機能を持っています:

GetHostName () {
NODE01_CHECK=`cat /etc/hosts | grep -w "node01" | awk '{print $1}'`
NODE02_CHECK=`cat /etc/hosts | grep -w "node02" | awk '{print $1}'`

IS_NODE1=`ifconfig -a | grep -w $NODE01_CHECK`
IS_NODE2=`ifconfig -a | grep -w $NODE02_CHECK`

if [[ ! -z $IS_NODE1 ]]; then
    echo "This is NODE 1"
fi

if [[ ! -z $IS_NODE2 ]]; then
    echo "This is Node 2"
fi

}

スクリプトは、クラスタの一部である2つのノードのうちの1つに特定のIPが設定されているかどうかを識別します。ローカルではうまく機能しますが、クラスタVIPのみを知っているサーバーでリモートで実行する必要があります。目標は、いくつかのファイルを2つのノードに転送することです。

だから私が実行したとき:

scp -r /tmp/files CLUST_VIP 
ssh CLUST_VIP <<EOF

        NODE01_CHECK=`cat /etc/hosts | grep -w "node01" | awk '{print $1}'`
        NODE02_CHECK=`cat /etc/hosts | grep -w "node02" | awk '{print $1}'`

        IS_NODE1=`ifconfig -a | grep -w $NODE01_CHECK`
        IS_NODE2=`ifconfig -a | grep -w $NODE02_CHECK`

        if [[ ! -z $IS_NODE1 ]]; then
               scp -r /tmp/files node02
        fi

        if [[ ! -z $IS_NODE2 ]]; then
               scp -r /tmp/files node01
        fi

  EOF

ただし、sshブロック内で同じコマンドを実行すると、次のメッセージが表示されます。

Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
Pseudo-terminal will not be allocated because stdin is not a terminal.

ssh -t上記のエラーを使用して削除してみましたが、grep環境変数が機能していないようです。

SSHブロックを介して環境変数を使用する方法はありますか?

答え1

man bash:

この文書の形式は次のとおりです。

          <<[-]word
                  here-document
          delimiter

パラメーターおよび変数拡張、コマンド置換、算術拡張、またはパス名拡張は実行されません。言葉。その中に文字があれば言葉引用符が付いている場合、区切り文字は引用符を削除した単語の結果であり、この文書の行は拡張されません。 もし言葉 引用符がない場合、ここにあるドキュメントのすべての行はパラメータ拡張、コマンド置換、および算術拡張を受け、文字シーケンス\ <newline>は無視され、\は\、$、および `文字を引用するために使用する必要があります。

答え2

変数とサブシェルは、SSHを介して送信される前に実行されます。sshコマンドを。catEOFscp

bash-ismsを使用しているので、bashシェルを使用していない人が実行している場合はこれを考慮することをお勧めします。

また、grepファイルを処理できるため、ファイルを挿入する必要はなく、ブロックコマンドにターゲットがありませんcatIS_NODE2scp

関連情報