Entorno de otro usuario en un process secundario

Tengo un process principal ejecutándose como usuario 'root'. Después de fork() , execl() y setuid()/setgid() , el process secundario se inicia como otro usuario del sistema operativo (digamos user1).

La printing del entorno muestra que esto es igual que el entorno raíz (como si iniciara session como raíz) y no como si iniciara session como usuario1. ¿Por qué?

¿Hay alguna manera de leer el entorno de usuario1 en el process secundario?

Solutions Collecting From Web of "Entorno de otro usuario en un process secundario"

Cada process tiene su propio entorno, copydo del padre . Si el padre es un intérprete de órdenes, hay un concepto de variables exportables que debe tenerse en count, pero esto no se aplica cuando se trata directamente de exec() etc. La variable LOGNAME normalmente se establece mediante un shell de inicio de session, solo está viendo un valor sobrante que no se restableció. Entonces, estás viendo el entorno infantil. En algunos sistemas no puede acceder fácilmente al entorno principal (u otro process), en Linux puede hacerlo fácilmente (sujeto a permissions) a través de /proc )

Probablemente pueda reproducir el efecto que está viendo probando su y su - , este último iniciará un entorno de inicio de session de shell que (casi con certeza) reiniciará LOGNAME entre otras cosas, el primero lo dejará intacto.

El uso del command env es una forma de get un entorno limpio cuando se inicia un nuevo process desde una línea de command, debe verificar la documentation de execle() en su sistema para ver cómo hacer algo similar.

Simplemente puede verificar el env de usuario usando:

 su -l user_name -c "run_programm && env" 

O puede verificar el env del process secundario utilizando su pid,

supongamos que su hijo process pid es 24112 , luego simplemente verifique env usando:

 cat /proc/24112/environ 

Algunos bits de información:

  • Puede usar execle o execve para proporcionar variables de entorno al niño. Puede usar esto para suprimir variables de entorno del process principal que ya no son adecuadas para el niño y para proporcionar variables adicionales al niño.
  • Puede iniciar un "shell de inicio de session" para el niño, por ejemplo, usando bash -l . Esto poblará el entorno como para un niño. Para muchos shells (incluido bash), anteponer un guion al nombre del binary, es decir, pasar -bash como argv[0] , tiene el mismo efecto. Un efecto principal de esta distinción es que un shell de inicio de session ejecutará /etc/profile y / u otros scripts de shell de perfil, que a su vez establecerán un gran número de variables de entorno.
  • Para los services que usan PAM para authentication e initialization de session, el module pam_env se encargará de inicializar adecuadamente el entorno. Puedes echarle un vistazo a eso y a su configuration, ya sea para usarlo o para imitar su comportamiento.

Cada process tiene un set de variables de entorno (que pueden establecerse en un shell export SOMEVAR=value etc.). Se henetworkingan como están por processs secundarios. Si desea restablecerlos, use extern char **environ; para llegar al entorno aprobado (ver environ(7) ), y luego usar execle(3) o execve(3) pasando una nueva matriz de entorno con valores de variables copydos. James Wheeler da una guía sobre qué y cómo hacerlo en su "HOWTO de progtwigción segura de Unix / Linux"