我的命令是
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
。多級引號和反斜杠是 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\""
會成功的...