Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: 0xDani en 21 Octubre 2012, 16:06 pm



Título: Cambiar variables de entorno en Linux
Publicado por: 0xDani en 21 Octubre 2012, 16:06 pm
La duda es: ¿como se cambia una variable de entorno en linux mediante codigo C/C++? A ser posible sin tener que llamar a system().

Saludos.


Título: Re: Cambiar variables de entorno en Linux
Publicado por: yoxter en 21 Octubre 2012, 17:18 pm
hasta donde se la mayoria de archivos que contienen variables de entorno estan en /etc/env.d

Código
  1. Gentoo yoxter # cd /etc/env.d
  2. Gentoo env.d # ls
  3. 00basic   03opencl                   05binutils  20java-config     37fontconfig  44qt4                 50gtk2     60ladspa  80cgc        90nss              99gentoolkit-env  gcc
  4. 00glibc   03opengl                   09sandbox   30gnupg           43kdepaths    44qt4-graphicssystem  50ncurses  70less    80mercurial  90xdg-data-base    99oxygen-gtk2     python
  5. 02locale  04gcc-x86_64-pc-linux-gnu  20ant       30xdg-data-local  44qca2        50gconf               60blender  77kde     90games      98ca-certificates  binutils
  6.  

otros distros y unix-like como Gentoo y FreeBSD almacenan casi todos las Flags de compilacion en el
/etc/make.conf


si Logras editar estos archivos desde tu programa usando fstream o alguna otra libreria deberia bastar

Pasate por aqui : http://www.gentoo.org/doc/es/handbook/handbook-x86.xml?part=2&chap=5 (http://www.gentoo.org/doc/es/handbook/handbook-x86.xml?part=2&chap=5)


Título: Re: Cambiar variables de entorno en Linux
Publicado por: Lambda en 21 Octubre 2012, 18:12 pm
http://pubs.opengroup.org/onlinepubs/007904975/functions/setenv.html


Título: Re: Cambiar variables de entorno en Linux
Publicado por: Foxy Rider en 22 Octubre 2012, 06:20 am
hasta donde se la mayoria de archivos que contienen variables de entorno estan en /etc/env.d

Código
  1. Gentoo yoxter # cd /etc/env.d
  2. Gentoo env.d # ls
  3. 00basic   03opencl                   05binutils  20java-config     37fontconfig  44qt4                 50gtk2     60ladspa  80cgc        90nss              99gentoolkit-env  gcc
  4. 00glibc   03opengl                   09sandbox   30gnupg           43kdepaths    44qt4-graphicssystem  50ncurses  70less    80mercurial  90xdg-data-base    99oxygen-gtk2     python
  5. 02locale  04gcc-x86_64-pc-linux-gnu  20ant       30xdg-data-local  44qca2        50gconf               60blender  77kde     90games      98ca-certificates  binutils
  6.  

otros distros y unix-like como Gentoo y FreeBSD almacenan casi todos las Flags de compilacion en el
/etc/make.conf


si Logras editar estos archivos desde tu programa usando fstream o alguna otra libreria deberia bastar

Pasate por aqui : http://www.gentoo.org/doc/es/handbook/handbook-x86.xml?part=2&chap=5 (http://www.gentoo.org/doc/es/handbook/handbook-x86.xml?part=2&chap=5)

1) /etc/env.d no es estándar, se usa sólo en Gentoo si no me falla la memoria ... si otra distro le usa, sigue siendo no-estándar
2) Si la pregunta hubiese sido cambiar variables de entorno en un lenguaje de scripting o durante el start-up del sistema, lo hubiese posteado en Unix/Unix-Like ... no, está en C/C++
3) /etc/make.conf es un fichero muy específico de metadistro (el nombre te sugiere eso ... "make", es el fichero que conduce la compilación de paquetes del sistema, no está pensado para variables fuera de eso)
4) Como Lambda bien dijo, está setenv() (http://pubs.opengroup.org/onlinepubs/9699919799/functions/setenv.html) y getenv() (http://pubs.opengroup.org/onlinepubs/9699919799/functions/getenv.html) para usarse en C/C++ (el subforo donde estás)

Saludos.


Título: Re: Cambiar variables de entorno en Linux
Publicado por: 0xDani en 22 Octubre 2012, 16:25 pm
Es que el otro dia encontre el truco de la variable de entorno LD_PRELOAD: http://systemadmin.es/2009/09/capturar-llamadas-al-sistema-con-ld_preload / http://jjmora.es/sabias-que-la-variable-ld_preload/ y lo estuve probando cambiando esta variable desde la terminal, y no sabia como hacerlo desde codigo. Gracias y saludos ;)
 
EDITO: He echo un pequeño codigo de prueba:

Código
  1. #include <stdlib.h>
  2.  
  3. int main()
  4. {
  5.  setenv("LD_PRELOAD", "/home/user/libprueba.so", 1);
  6.  system("echo $LD_PRELOAD");
  7.  return 0;
  8. }

Y en la terminal:

Código:
$ gcc prueba.c -o prueba
./prueba
/home/user/libprueba.so //Hasta aqui bien
//Ahora saco por pantalla esta variable
echo $LD_PRELOAD
                               //En esta linea no sale nada, la variable ha cambiado su valor a 0 :(
$