mi comando es
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
debe presentarse entre comillas dobles. ¿Cómo se puede hacer?
Respuesta1
Tiene varios niveles de comillas dobles anidadas. eso se vuelve muy engañoso, muy feo y muy difícil de leer y modificar. por ejemplo `
ssh ${OS_USER}@${OS_HOST} \
". ~/.kshrc; ... ;
echo \"export RC_DB_INSTANCE=\\\"\\\$7\\\"\" >> RC_CONV_SET_VARS".
(NOTA: probé las comillas múltiples echo
en bash -c
mi sistema y funcionó con eso, pero ni siquiera estoy 100% seguro de que funcionará en ssh
. Múltiples niveles de comillas y barras invertidas son un PITA y deben evitarse)
y luego se vuelve aún más complicado si RC_CONV_SET_VARS no es un nombre de archivo literal sino un nombre de variable.... aún más complicado dependiendo de si RC_CONV_SET_VARS es local para su sistema o para el sistema remoto.
Es mucho más fácil escribir un script simple y desechable, scp
enviarlo al host remoto y luego ejecutarlo allí con ssh
.
Por ejemplo:
Guarde lo siguiente como 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"
Luego, scp
vaya al host remoto y ejecútelo:
scp myscript.ksh "${OS_USER}@${OS_HOST}:/tmp/"
ssh "${OS_USER}@${OS_HOST}" 'ksh /tmp/myscript.ksh'
Todavía hay problemas con las citas por resolver, pero son más o menos los mismos que tendría con las citas al escribir un script que pretende ejecutar en el sistema local. No hay múltiples niveles feos, complicados y confusos de barras invertidas y comillas.
Si esto parece poco práctico porque tendría que escribir la contraseña varias veces, entonces no lo haga: configure la autenticación basada en claves yno use autenticación basada en contraseña con ssh.
Por cierto, puedes pasar cualquier argumento que necesites en la ksh myscript.sh
línea de comando.
ssh "${OS_USER}@${OS_HOST}" 'ksh /tmp/myscript.ksh arg1 arg2 arg3'
o, si necesita pasar el séptimo argumento dellocalscript al script remoto:
ssh "${OS_USER}@${OS_HOST}" "ksh /tmp/myscript.ksh \"$7\""
y cambie la última línea de myscript.ksh
arriba a algo como:
echo "export RC_DB_INSTANCE=\"$1\"" >> "$RC_CONV_SET_VARS"
Respuesta2
Tendrás que "escapar" de las comillas:
echo "export RC_DB_INSTANCE=\"$7\""
hará el truco...