En Unix, ¿hay alguna forma de que un proceso pueda cambiar las variables de entorno de otro (asumiendo que todas las ejecuta el mismo usuario)? Una solución general sería lo mejor, pero si no, ¿qué pasa con el caso específico en el que uno es hijo del otro?
Editar: ¿Qué tal a través de gdb?
Respuestas:
A través de gdb:
Este es un truco bastante desagradable y, por supuesto, solo debe hacerse en el contexto de un escenario de depuración.
fuente
ptrace: Operation not permitted
Probablemente puedas hacerlo técnicamente (ver otras respuestas), pero es posible que no te ayude.
La mayoría de los programas esperarán que las vars env no se puedan cambiar desde el exterior después del inicio, por lo tanto, la mayoría probablemente solo leerán las vars que les interesan al inicio y se inicializarán basándose en eso. Así que cambiarlos después no hará ninguna diferencia, ya que el programa nunca los volverá a leer.
Si publicó esto como un problema concreto, probablemente debería adoptar un enfoque diferente. Si fue solo por curiosidad: Buena pregunta :-).
fuente
Básicamente, no. Si tenía suficientes privilegios (root, o algo parecido) y hurgó en / dev / kmem (memoria del kernel), e hizo cambios en el entorno del proceso, y si el proceso realmente volvió a hacer referencia a la variable de entorno después (es decir, el proceso aún no había tomado una copia de env var y no estaba usando solo esa copia), entonces tal vez, si tenía suerte e inteligencia, y el viento soplaba en la dirección correcta, y la fase de la luna era correcta, tal vez, podrías lograr algo.
fuente
gdb
en el proceso principal y está programado para realizar el cambio, y funciona sin bloquear el proceso principal. Está bien, probablemente puedas hacerlo, pero no es algo que vayas a hacer de forma rutinaria. A efectos prácticos, por lo tanto, la respuesta sigue siendo no . El resto de la respuesta cubre las alternativas teóricamente posibles y algo poco factibles.Citando a Jerry Peek:
Lo único que puede hacer es cambiar la variable de entorno del proceso hijo antes de iniciarlo: obtiene la copia del entorno padre, lo siento.
Consulte http://www.unix.com.ua/orelly/unix/upt/ch06_02.htm para obtener más detalles.
Solo un comentario sobre la respuesta sobre el uso de / proc. Bajo linux / proc es compatible, pero no funciona, no puede cambiar el
/proc/${pid}/environ
archivo, incluso si es root: es absolutamente de solo lectura.fuente
Podría pensar en una forma bastante artificial de hacer eso, y no funcionará para procesos arbitrarios.
Suponga que escribe su propia biblioteca compartida que implementa 'char * getenv'. Luego, configura el entorno 'LD_PRELOAD' o 'LD_LIBRARY_PATH'. vars para que ambos procesos se ejecuten con su biblioteca compartida precargada.
De esta manera, esencialmente tendrá un control sobre el código de la función 'getenv'. Entonces, podrías hacer todo tipo de trucos desagradables. Su 'getenv' podría consultar el archivo de configuración externo o el segmento SHM para obtener valores alternativos de env vars. O puede hacer una búsqueda / reemplazo de expresiones regulares en los valores solicitados. O ...
No puedo pensar en una manera fácil de hacerlo para procesos en ejecución arbitrarios (incluso si eres root), salvo reescribir el enlazador dinámico (ld-linux.so).
fuente
O obtenga su proceso para actualizar un archivo de configuración para el nuevo proceso y luego:
fuente
No tan lejos como sé. Realmente está tratando de comunicarse de un proceso a otro que requiere uno de los métodos IPC (memoria compartida, semáforos, sockets, etc.). Después de haber recibido datos mediante uno de estos métodos, puede establecer variables de entorno o realizar otras acciones de forma más directa.
fuente
Si su unix admite el sistema de archivos / proc, entonces es trivial LEER el entorno: puede leer el entorno, la línea de comandos y muchos otros atributos de cualquier proceso que posea de esa manera. Cambiarlo ... Bueno, se me ocurre una manera, pero es una MALA idea.
El caso más general ... No lo sé, pero dudo que haya una respuesta portátil.
(Editado: mi respuesta original asumió que el OP quería LEER el env, no cambiarlo)
fuente
UNIX está lleno de comunicación entre procesos. Compruebe si su instancia de destino tiene algunos. Dbus se está convirtiendo en un estándar en IPC de "escritorio".
Cambio las variables de entorno dentro del administrador de ventanas Awesome usando awesome-client con un "remitente" de Dbus de código lua.
fuente
No es una respuesta directa, pero ... Raymond Chen tenía un fundamento [basado en Windows] en torno a esto solo el otro día : -
En otras palabras, cualquiera de estas instalaciones del kernel sería
Sin embargo, la razón más probable es simplemente que hay casos de uso limitados para dicha instalación.
fuente
Parece que putenv no funciona ahora, pero setenv sí. Estaba probando la respuesta aceptada mientras intentaba establecer la variable en el shell actual sin éxito
y la variante de cómo funciona:
fuente