この問題はsshとは関係ありませんが、ここにはという文書がbashやその他のPosixシェルにのみ関連しています。
区切りの単語
ヒアドキュメント
- []
< <:ヒアドキュメントの形式がある
:bashのための
マンページはこちら段落を文書で述べています
wordのパラメータ展開、コマンド置換、算術展開、パス名展開は実行されません。 単語内の文字がと引用符で囲まれている場合、区切り記号は単語の引用符の削除の結果であり、ここの文書の行は展開されません。 wordが引用されていない場合、here-documentのすべての行は、パラメータ展開、コマンド置換、および算術展開の対象となります。後者の場合は、文字列\<newline>
は無視され、\
,$
、および `の文字を引用するには\
を使用する必要があります。
あなたがEOF
を引用すると、あなたは明示的に$1
と$2
変数を置き換えないシェルをお願いします。
最も堅牢な方法は、EOFを引用せず、ここの文書内の他のすべての特殊文字を一貫して引用することです。例えば
、ここにあなたのがのようなものに含まれる文書場合:
ssh -T [email protected] << EOF
for f in /var/log/messages*
do echo "Filename: " \$f
done
EOF
方法すべて引用符で囲まれていない:あなたはEOFの周りが、$
内側に1と引用符なしでそれを書き換えることができ
ssh -T [email protected] << 'EOF'
for f in /var/log/messages*
do echo "Filename: " $f
done
EOF
を変数は補間される。
また、サーバーで許可されている場合は、2つのパラメータを環境変数として渡すこともできます。
PARAM1
とPARAM2
という名前を使用するとします。サーバー上のsshd_config
ファイルには、デフォルトでは、セキュリティ上の理由から、環境変数が受け入れられないため、AcceptEnv PARAM1 PARAM2
という行が含まれている必要があります。
その後、使用することができます。
export PARAM1=$1
export PARAM2=$2
ssh -T -o SendEnv=PARAM1 -o SenEnv=PARAM2 [email protected] << 'EOF'
...
Using variables $PARAM1 and $PARAM2
...
EOF
私はFreeBSDのボックスの上に再現することはできません。この単純なbashスクリプトの出力:./tst.sh ABCと呼ば '$ 1 << $ 2 のssh -TのlocalhostとエコーEOF エコーのfoo エコー$ 1 は$ 2 エコーバー をエコーエコーEOF' デフとして期待されています 'ABC デフ fooの ABC デフ bar'(フォーマットコメントによって除去改行が、答えは間違いではありません)あなたはこの問題を再現することはできませんなぜハード –
が言うこと。私はCentOS OSボックスを使用しています。ローカルホストではなく、実際のリモートサーバーを使用してみてください。 – Steeve007
ローカルホストとリモートサーバで自分のスクリプトを使用するとどうなりますか? –