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 source
un "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
source
necesita 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.