私のコマンドは
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
複数ssh
の引用符とバックスラッシュはPITAなので避けてください。)
これにより、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\""
動作します...