簡単なスクリプトを使用して、クラスタ内のさまざまなノードでコマンドの実行を自動化したいと思います。私は実行できることを確認しました。
#!/bin/bash
echo "Machine: "$HOSTNAME;
ssh machine2 'echo Machine: $HOSTNAME;'
echo "Machine: "$HOSTNAME;
期待される結果を得る。
Machine: machine1
Machine: machine2
Machine: machine1
ただし、変数が必要なより複雑なコマンドを実行したいので、代わりに使用する必要があります"
。しかし、これはsshが機能しないようです。'
ssh
#!/bin/bash
echo "Machine: "$HOSTNAME;
ssh machine2 "echo Machine: $HOSTNAME;"
echo "Machine: "$HOSTNAME;
返品:
Machine: machine1
Machine: machine1
Machine: machine1
私は見たその他の問題runコマンドをこのように使用するようにはっきりと出ているので、"
ここで何が起こっているのか混乱しています。
答え1
あなたが要求するのは、ローカルに評価される変数とリモートで評価されるべき変数を混在させて一致させる方法だと思います。
1つのオプションは、リモート操作用のスクリプトを作成してローカル変数への参照をカプセル化して、ローカルホストの引用符が拡張されていることを確認できないようにすることです。
非常に短いフラグメントの場合、別のオプションは次のように引用符を混在させることです。
FRUIT=apples
ssh machine2 "echo Eating $FRUIT "'on $HOSTNAME'
ssh
二重引用符で囲まれたセクション内の変数は、ローカルで(実行前)評価されます。一重引用符で囲まれた段落内のすべての内容はリテラルとして扱われます。引用符で囲まれた2つの文字列を連結して文字列を生成し、echo Eating apples on $HOSTNAME
結果をリモートで評価できるようにリテラルに渡します。
答え2
直接確認できます。
[user@bluepc ~]$ echo "$HOSTNAME;"
bluepc;
[user@bluepc ~]$ echo '$HOSTNAME;'
$HOSTNAME;
一重引用符内の環境変数は文字列として扱われます。
SSHの場合は二重引用符を使用する場合:
- 文字列はローカルサーバーで置き換えられます。
- コマンドはリモートで実行されます。
一重引用符を使用する場合:
- 文字列はそのままリモートサーバーに渡されます。
- リモート交換
- コマンドが実行されました