¿Puedes conseguir un "documento aquí"?

¿Puedes conseguir un "documento aquí"?

Digamos que tengo un script bash que actúa como un archivo de configuración para otro script bash:

config.sh:

verbose=yes
echo "Malicious code!"
name=test

guión.sh:

source config.sh
echo "After sourcing: verbose='$verbose', name='$name'"

El problema es que esto no es muy seguro, ya que todo lo que se coloca en config.sh se ejecuta:

$ ./script.sh
Malicious code!
After sourcing: verbose='yes', name='test'

Para hacerlo más seguro, pensé en separar las operaciones de asignación y ejecutarlas solo. Lo lograría pasando sourceun "documento aquí":

guión.sh:

source <<EOF
$(grep -P '^\s*\w+=' test.sh)
EOF
echo "After sourcing: verbose='$verbose', name='$name'"

(Sí, sé que la expresión regular no es tan fuerte; es solo un marcador de posición). Lamentablemente, la fuente no parece funcionar bien con estos documentos:

./script.sh: line 1: source: filename argument required
source: usage: source filename [arguments]
After sourcing: verbose='', name=''

Obviamente, podría hacer muchas cosas para obtener datos de configuración de un archivo y, de todos modos, probablemente sea más seguro.

Pero todavía me queda esta picazón; Quiero saber si lo que he probado puede funcionar. ¿Alguna sugerencia?

Respuesta1

source <(cat << EOF
A=42
EOF
)
echo $A

Producción:

42

Respuesta2

sourcenecesita un nombre de archivo, no puede redirigir la entrada a él.

En mi sistema, pude usar la sustitución de procesos en su lugar:

source <( grep = test.sh )

Reemplace =con la expresión regular apropiada.

Respuesta3

Puedes hacerlo directamente eval:

eval "$(grep -P '^\s*\w+=' config.sh)" 
#quotes needed if you want the full content of the file (including newlines etc.)

El abastecimiento es esencialmente lo mismo que:

eval "$(cat file)"   

Tenga en cuenta, sin embargo, que las personas podrían estar ejecutando todos los kinz de codez en el lado derecho del signo igual:

a=$(evil_code_here)
b=`evil_code_here`
c="something" evil_code_here
#etc.

Necesitas un filtro mejor.

información relacionada