Forzando la sustitución de cadena en una función declarada de un script de shell.
Estoy trabajando en un script para mover algunos archivos a un servidor remoto (ver: https://stackoverflow.com/questions/70610087/function-calls-in-here-document-for-unix-shell-script/70611984#70611984 para más detalles). Para permitir que el script funcione tanto en una máquina local como en un servidor remoto, estoy utilizando ‘declare -f’ para envolver una función existente que se ejecutará de forma remota. Hasta ahora he llegado a esto:
myscript.sh
REMOTE_HOST=myhost
TMP=eyerep-files
getMoveCommand()
{
echo Src Dir: $2
sudo cp ~/$TMP/start.ini ~/$1/start_b.ini
ls ~/$2
echo Target Dir: $1
ls ~/$1
}
moveRemote()
{
echo "intentando mover con here doc"
echo $(declare -fp getMoveCommand)
ssh -t "$REMOTE_HOST" "$(declare -fp getMoveCommand); getMoveCommand ${1@Q} ${TMP@Q}"
}
moveFiles()
{
case "$1" in
# despliegue remoto
remote)
moveRemote $2
;;
# despliegue local
local)
getMoveCommand $2
;;
*)
echo "Uso: myscript.sh {local|remote}"
exit 1
;;
esac
}
moveFiles $1 $2
exit 0
Si se llama con ‘./myscript.sh remote dev’, el script debe realizar un SSH en el servidor remoto y mover un archivo de una carpeta a otra. El problema con el que me encuentro es la sustitución de cadenas. Tengo varias variables globales actuando como constantes a las que la función getMoveCommand necesita acceder. En el ejemplo aquí, solo hay una variable (TMP), por lo que simplemente puedo pasarla como argumento. Sin embargo, en el script real, el trabajo que se realiza es más complicado y la cantidad de argumentos que se necesitarían pasar haría que esta solución fuera incómoda. Dado que no se espera que esas variables cambien, parece que debería ser posible forzar la sustitución de cadenas antes de enviar la función envuelta a través de SSH.
¿Es posible hacer lo que quiero y, de ser así, cómo? Si no es posible, ¿hay otra forma de manejar esto que no requiera pasar una gran cantidad de argumentos a la función?
davy.ai
Sí, es posible hacer lo que deseas. Una forma de manejar esto es utilizando la sustitución de comandos para reemplazar las variables por sus valores antes de pasar la función a ssh.
Por ejemplo, puedes modificar la función moveRemote para usar la sustitución de comandos de la siguiente manera:
Aquí, utilizamos el comando
sed
para reemplazar cualquier aparición deTMP=
en la salida dedeclare -fp getMoveCommand
por el valor de$TMP
. De esta manera, la variable$TMP
se reemplaza por su valor antes de enviar la función a ssh.Este enfoque se puede extender a otras variables también, lo que te permite evitar pasar un gran número de argumentos a la función.
Ten en cuenta que utilizar la sustitución de comandos de esta manera puede potencialmente llevar a vulnerabilidades de inyección de código si los valores de las variables no se sanitizan adecuadamente. Asegúrate de validar y sanitizar correctamente cualquier entrada antes de utilizarla de esta manera.