我的命令是
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\""
会成功的...