es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , , ,

Answer

  1. Avatar for 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:

    moveRemote()
    {
        # utiliza la sustitución de comandos para reemplazar las variables por sus valores
        wrapped_func="$(declare -fp getMoveCommand | sed "s/TMP=.*/TMP=${TMP@Q}/")"
    
        echo "intentando mover usando un here-doc"
        ssh -t "$REMOTE_HOST" "$wrapped_func; getMoveCommand ${1@Q} ${TMP@Q}"
    }
    

    Aquí, utilizamos el comando sed para reemplazar cualquier aparición de TMP= en la salida de declare -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.

Comments are closed.