Necesito crear un archivo de configuración para mi propio script: aquí un ejemplo:
guión:
#!/bin/bash
source /home/myuser/test/config
echo "Name=$nam" >&2
echo "Surname=$sur" >&2
Contenido de /home/myuser/test/config
:
nam="Mark"
sur="Brown"
eso funciona!
Mi pregunta: ¿es esta la forma correcta de hacer esto o hay otras formas?
bash
shell
shell-script
Pol Hallen
fuente
fuente
abcde
también lo hace de esta manera y ese es un programa bastante grande (para un script de shell). Puedes echarle un vistazo aquí .Respuestas:
source
no es seguro ya que ejecutará código arbitrario. Esto puede no ser una preocupación para usted, pero si los permisos de los archivos son incorrectos, es posible que un atacante con acceso al sistema de archivos ejecute el código como un usuario privilegiado mediante la inyección de código en un archivo de configuración cargado por un script protegido de otra manera, como un guión de inicio.Hasta ahora, la mejor solución que he podido identificar es la torpe solución de reinventar la rueda:
myscript.conf
Utilizando
source
, esto se ejecutaríaecho rm -rf /
dos veces, así como cambiaría el usuario en ejecución$PROMPT_COMMAND
. En cambio, haz esto:myscript.sh (Bash 4)
myscript.sh ( compatible con Mac / Bash 3)
Responda si encuentra una vulnerabilidad de seguridad en mi código.
fuente
*
entradas correctamente, pero entonces, ¿qué en Bash maneja bien ese carácter?my\\password
Aquí hay una versión limpia y portátil que es compatible con Bash 3 y superiores, tanto en Mac como en Linux.
Especifica todos los valores predeterminados en un archivo separado, para evitar la necesidad de una función de configuración de "valores predeterminados" enorme, desordenada y duplicada en todos sus scripts de shell. Y le permite elegir entre leer con o sin fallos predeterminados:
config.cfg :
config.cfg.defaults :
config.shlib (esta es una biblioteca, por lo que no hay shebang-line):
test.sh (o cualquier script donde desee leer los valores de configuración) :
Explicación del script de prueba:
printf
línea? Bueno, es algo que debes tener en cuenta:echo
es un mal comando para imprimir texto sobre el que no tienes control. Incluso si usa comillas dobles, interpretará las banderas. Intente configurarmyvar
(inconfig.cfg
)-e
y verá una línea vacía, porqueecho
pensará que es una bandera. Peroprintf
no tiene ese problema. Elprintf --
dice "imprime esto y no interpretes nada como banderas", y"%s\n"
dice "formatea la salida como una cadena con una nueva línea final, y finalmente el parámetro final es el valor para que printf formatee.myvar="$(config_get myvar)";
. Si va a imprimirlos en la pantalla, le sugiero que use printf para estar totalmente seguro contra cualquier cadena incompatible con el eco que pueda estar en la configuración del usuario. Pero echo está bien si la variable proporcionada por el usuario no es el primer carácter de la cadena que está repitiendo, ya que esa es la única situación en la que se podrían interpretar "flags", por lo que algo comoecho "foo: $(config_get myvar)";
es seguro, ya que el "foo" no comienza con un guión y, por lo tanto, le dice a echo que el resto de la cadena tampoco son marcas para él. :-)fuente
config.cfg.defaults
lugar en lugar de definirlos al momento de llamar$(config_get var_name "default_value")
. tritarget.org/static/…Analiza el archivo de configuración, no lo ejecutes.
Actualmente estoy escribiendo una aplicación en el trabajo que usa una configuración XML extremadamente simple:
En el script de shell (la "aplicación"), esto es lo que hago para obtener el nombre de usuario (más o menos, lo he puesto en una función de shell):
El
xml
comando es XMLStarlet , que está disponible para la mayoría de los Unices.Estoy usando XML ya que otras partes de la aplicación también se ocupan de datos codificados en archivos XML, por lo que fue más fácil.
Si prefiere JSON, existe
jq
un analizador de JSON de shell fácil de usar.Mi archivo de configuración se vería así en JSON:
Y luego obtendría el nombre de usuario en el script:
fuente
eval
para establecer múltiples valores, entonces está ejecutando partes seleccionadas del archivo de configuración :-).eval
nada. El impacto en el rendimiento de usar un formato estándar con un analizador existente (aunque sea una utilidad externa) es insignificante en comparación con la robustez, la cantidad de código, la facilidad de uso y la facilidad de mantenimiento.La forma más común, eficiente y correcta es usar
source
, o.
como forma abreviada. Por ejemplo:o
Sin embargo, hay que tener en cuenta los problemas de seguridad que puede generar el uso de un archivo de configuración adicional de origen externo, dado que se puede insertar código adicional. Para obtener más información, incluso sobre cómo detectar y resolver este problema, recomendaría echar un vistazo a la sección 'Asegúrelo' de http://wiki.bash-hackers.org/howto/conffile#secure_it
fuente
Lo uso en mis scripts:
Debería admitir todas las combinaciones de caracteres, excepto que las teclas no pueden tener
=
en ellas, ya que ese es el separador. Cualquier otra cosa funciona.Además, esto es completamente seguro ya que no utiliza ningún tipo de
source
/eval
fuente
Para mi escenario,
source
o.
estaba bien, pero quería admitir las variables de entorno local (es decir,FOO=bar myscript.sh
) teniendo prioridad sobre las variables configuradas. También quería que el archivo de configuración fuera editable por el usuario y cómodo para alguien acostumbrado a obtener archivos de configuración, y mantenerlo lo más pequeño / simple posible, para no distraerme del impulso principal de mi script muy pequeño.Esto es lo que se me ocurrió:
Esencialmente, comprueba las definiciones de variables (sin ser muy flexible sobre los espacios en blanco) y reescribe esas líneas para que el valor se convierta en un valor predeterminado para esa variable, y la variable no se modifica si se encuentra, como la
XDG_CONFIG_HOME
variable anterior. Obtiene esta versión alterada del archivo de configuración y continúa.El trabajo futuro podría hacer que el
sed
script sea más robusto, filtrar líneas que parecen extrañas o no son definiciones, etc., no interrumpir los comentarios al final de la línea, pero esto es lo suficientemente bueno para mí por ahora.fuente
Esto es sucinto y seguro:
Esto
-i
garantiza que solo obtenga las variables decommon.vars
fuente
Puedes hacerlo:
fuente