¿Variables de entorno protegidas?

¿Variables de entorno protegidas?

¿Hay nombres de variables de entorno que el usuario/una llamada no pueden sobrescribir setenv? Según tengo entendido por POSIX1.2008, cualquier proceso puede editar el bloque de entorno, pero debe evitar sobrescribir variables como LANG, etc.

Respuesta1

El entorno es una lista de cadenas de la forma var=value(por convención) que se pasa como tercer argumento a la llamada al sistema execve().

Esa lista se coloca en algún lugar de la pila del proceso cuando comienza a ejecutar el nuevo comando al igual que la lista de argumentos (otra lista de cadenas pasadas como segundo argumento a execve()).

En los programas que utilizan libc (la mayoría), un código de inicialización llamado antes de main()invocar la función hace que esas cadenas de entorno estén disponibles como environmatriz.

libcTambién proporciona funciones putenvque setenvpueden modificar (una copia de) esa lista que recibió el programa. Esa copia mantenida y modificada se pasará al siguiente comando ejecutado por el proceso o cualquiera de sus hijos a través de las funciones execvp()// execl()/ system()... popen()de la libc (que a su vez terminan llamando a la execve()llamada del sistema).

Ahora, mientras crea una lista de cadenas que pasa manualmente a la execve()llamada al sistema, puede pasar cadenas como foo(sin un =carácter) o =bar(con un nombre de variable vacío), setenvno le permitirá hacerlo ( setenv("", "bar", 1)se rechaza).

setenv("a=b", "c")también será rechazado. Por lo tanto, las cadenas que se definirán setenvsiempre tendrán un formato x=yque xno podrá estar vacío.

Esa es aproximadamente la única restricción (también aplicada por putenv). Bueno, aquellas que son cadenas terminadas en NUL, por supuesto, el carácter NUL no puede aparecer en el nombre o valor de la variable.

setenv("*", "x", 1), o setenv("\n\n", "", 1)están todos bien en lo que setenv()respecta al núcleo. Ahora bien, si vas a poder hacer algo útil con ellos es otra cuestión.

Respuesta2

No, no existen restricciones sobre qué variables de entorno puede cambiar un proceso. Sin embargo, tenga en cuenta que cada proceso tiene supropia copiadel entorno heredado, y un proceso no puede cambiar ninguna variable de entorno en ningún otro proceso. La setenvllamada sólo puede modificar el entorno dentro del proceso de llamada.

Respuesta3

export MYENV=value
readonly MYENV

Respuesta4

Creo que depende completamente del shell que estés ejecutando.

En Bash UIDes uno BASH_VERSINFOes otro según la página de manual.

Por otro lado en csh según el manualLas variables de entorno no se pueden convertir en de solo lectura.

información relacionada