私の命令は
X=`ssh ${OS_USER}@${OS_HOST} ". ~/.kshrc ;
ulimit -c unlimited ;
cd ${OS_PATH}/NEW_BL1_RC_RATE/bin/conf;
echo "export RC_DB_INSTANCE=$7" >> RC_CONV_SET_VARS"`
$7
二重引用符で囲む必要があります。どうすればよいでしょうか?
答え1
二重引用符が複数レベルにネストされています。これは非常に扱いにくく、見苦しく、読みにくく、変更も困難です。例: `
ssh ${OS_USER}@${OS_HOST} \
". ~/.kshrc; ... ;
echo \"export RC_DB_INSTANCE=\\\"\\\$7\\\"\" >> RC_CONV_SET_VARS".
echo
(注: 私のシステムでで多重引用符をテストしたところbash -c
、 では動作しましたが、 で動作するかどうかは 100% 確信がありませんssh
。 複数レベルの引用符とバックスラッシュは面倒なので避けるべきです)
RC_CONV_SET_VARS がリテラル ファイル名ではなく変数名である場合は、さらに複雑になります。RC_CONV_SET_VARS がシステムに対してローカルであるか、リモート システムに対してローカルであるかによって、さらに複雑になります。
scp
単純な使い捨てスクリプトを書いて、それをリモート ホストに送信し、そこで で実行する方がはるかに簡単ですssh
。
例えば:
以下を次のように保存しますmyscript.ksh
:
#! /usr/bin/ksh
. ~/.kshrc
ulimit -c unlimited
cd ${OS_PATH}/NEW_BL1_RC_RATE/bin/conf
echo 'export RC_DB_INSTANCE="$7"' >> "$RC_CONV_SET_VARS"
次に、scp
リモート ホストにダウンロードして実行します。
scp myscript.ksh "${OS_USER}@${OS_HOST}:/tmp/"
ssh "${OS_USER}@${OS_HOST}" 'ksh /tmp/myscript.ksh'
解決すべき引用符の問題はまだありますが、ローカル システムで実行するスクリプトを作成するときに引用符を使用する場合とほぼ同じです。バックスラッシュ エスケープと引用符の複数のレベルは見苦しく、複雑で、混乱を招くものではありません。
パスワードを複数回入力する必要があるため、これが非現実的と思われる場合は、そうしないでください。キーベースの認証を設定し、SSHでパスワードベースの認証を使用しないでください。
ちなみに、必要な引数はksh myscript.sh
コマンドラインで渡すことができます。
ssh "${OS_USER}@${OS_HOST}" 'ksh /tmp/myscript.ksh arg1 arg2 arg3'
または、7番目の引数を渡す必要がある場合は、地元スクリプトをリモート スクリプトに追加します。
ssh "${OS_USER}@${OS_HOST}" "ksh /tmp/myscript.ksh \"$7\""
上記の最後の行をmyscript.ksh
次のように変更します。
echo "export RC_DB_INSTANCE=\"$1\"" >> "$RC_CONV_SET_VARS"
答え2
引用符を「エスケープ」する必要があります。
echo "export RC_DB_INSTANCE=\"$7\""
うまくいくでしょう...