¿Hay alguna manera de cambiar las variables de entorno de otro proceso en Unix?

En Unix, ¿hay alguna forma en que un proceso pueda cambiar las variables de entorno de otro (suponiendo que el mismo usuario lo esté ejecutando)? Una solución general sería la mejor, pero si no, ¿qué pasa con el caso específico donde uno es hijo de otro?

Editar: ¿Qué tal a través de gdb?

A través de gdb:

(gdb) attach process_id (gdb) call putenv ("env_var_name=env_var_value") (gdb) detach 

Este es un hack bastante desagradable y solo debería hacerse en el contexto de un escenario de depuración, por supuesto.

Probablemente pueda hacerlo técnicamente (ver otras respuestas), pero puede que no lo ayude.

La mayoría de los progtwigs esperarán que los archivos no se puedan cambiar desde el exterior después del inicio, por lo tanto, la mayoría probablemente solo leerán los vars que les interesan al inicio e inicializarán en función de eso. Entonces, cambiarlos después no marcará la diferencia, ya que el progtwig 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 :-).

Sustancialmente, no. Si tenía privilegios suficientes (raíz, o menos) y hurgó en / dev / kmem (memoria del kernel), e hizo cambios en el entorno del proceso, y si el proceso realmente re-referenciaba la variable de entorno después (es decir, el proceso aún no había tomado una copia del env var y no estaba usando solo esa copia), entonces tal vez, si era afortunado e inteligente, y el viento soplaba en la dirección correcta, y la fase de la luna era correcta, tal vez, puedes lograr algo

Citando a Jerry Peek:

No puedes enseñar trucos nuevos a un viejo perro.

Lo único que puede hacer es cambiar la variable de entorno del proceso hijo antes de iniciarlo: obtiene la copia del entorno principal, lo siento.

Ver http://www.unix.com.ua/orelly/unix/upt/ch06_02.htm para más detalles.

Solo un comentario sobre la respuesta sobre el uso de / proc. En linux / proc es compatible, pero no funciona, no puede cambiar el archivo /proc/${pid}/environ , incluso si es root: es absolutamente de solo lectura.

Podría pensar en la forma bastante artificial de hacer eso, y no funcionará para procesos arbitrarios.

Supongamos que escribe su propia biblioteca compartida que implementa ‘char * getenv’. Luego, configura el env de ‘LD_PRELOAD’ o ‘LD_LIBRARY_PATH’. vars para que ambos procesos se ejecuten con la biblioteca compartida precargada.

De esta forma, 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 valores alternativos de env vars. O puede hacer una búsqueda regular / reemplazar 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 para reescribir el enlazador dynamic (ld-linux.so).

No tan lejos como sé. Realmente intentas comunicar de un proceso a otro que requiere uno de los métodos de IPC (memoria compartida, semáforos, tomas de stream, etc.). Una vez que haya recibido los datos por uno de estos métodos, podrá establecer variables de entorno o realizar otras acciones más directamente.

O haga que su proceso actualice un archivo de configuración para el nuevo proceso y luego:

  • realizar un kill -HUP en el nuevo proceso para volver a leer el archivo de configuración actualizado, o
  • haga que el proceso verifique el archivo de configuración para ver las actualizaciones de vez en cuando. Si se encuentran cambios, vuelva a leer el archivo de configuración.

HTH.

aclamaciones,

Robar

Si su UNIX es compatible con el sistema de archivos / proc, entonces es trivial LEER el env, puede leer el entorno, la línea de comandos y muchos otros atributos de cualquier proceso que posea de esa manera. Cambiándolo … Bueno, puedo pensar en una forma, 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 suponía que el OP quería LEER el env, no cambiarlo)

UNIX está lleno de comunicación entre procesos. Verifica si tu instancia objective tiene algo. Dbus se está convirtiendo en un estándar en IPC “de escritorio”.

Cambio las variables de entorno dentro de Awesome window manager usando awesome-client with es un “emisor” de Dbus del código lua.

No es una respuesta directa, pero … Raymond Chen tenía un razonamiento [basado en Windows] sobre esto solo el otro día : –

… Aunque ciertamente existen formas de hacerlo no compatibles o formas que funcionan con la ayuda de un depurador, no hay nada que sea compatible con el acceso programático a la línea de comando de otro proceso, al menos nada provisto por el kernel. …

Que no haya es una consecuencia del principio de no hacer un seguimiento de la información que no necesita. El kernel no necesita obtener la línea de comando de otro proceso. Lleva la línea de comando pasada a la función CreateProcess y la copia en el espacio de direcciones del proceso que se inicia, en una ubicación donde la función GetCommandLine puede recuperarla. Una vez que el proceso puede acceder a su propia línea de comando, las responsabilidades del kernel están hechas.

Como la línea de comando se copia en el espacio de direcciones del proceso, el proceso incluso puede escribir en la memoria que contiene la línea de comando y modificarla. Si eso sucede, entonces la línea de comando original se pierde para siempre; la única copia conocida fue sobrescrita.

En otras palabras, cualquiera de esas instalaciones de kernel sería

  • difícil de implementar
  • potencialmente una preocupación de seguridad

Sin embargo, la razón más probable es simplemente que haya casos de uso limitados para dicha instalación.