私は次の機能を持っています:
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
コマンドを。cat
EOF
scp
bash-ismsを使用しているので、bash
シェルを使用していない人が実行している場合はこれを考慮することをお勧めします。
また、grep
ファイルを処理できるため、ファイルを挿入する必要はなく、ブロックコマンドにターゲットがありませんcat
。IS_NODE2
scp