2011-12-13 7 views
6

en un entorno Linux (en mi caso XUbuntu), ¿hay alguna manera de averiguar a qué variables de entorno se accede mediante un comando que se ejecuta desde la consola?Averigüe qué variables de entorno utiliza un comando

Debe ser posible conocer estas variables, ya que alguien debe proporcionar los valores al programa. Pero, ¿hay algún método predeterminado para hacer esto?

El programa en cuestión aquí es xprintidle.

Gracias de antemano, Jost

Respuesta

7

asumiendo que usted quiere las variables utilizadas realmente por algún proceso en ejecución de un comando, se puede usar ltrace y buscar llamadas a getenv

Por supuesto, el argumento a getenv puede ser calculado (por lo que no se puede predecir realmente).

Sin embargo, algunas aplicaciones (viejas o extrañas) pueden usar el environ global, o el tercer argumento opcional en main; y algunas aplicaciones incluso cambian su entorno usando putenv, setenv o unsetenv (todas las 3 son las funciones libc, no el shell incorporado).

pero xprintidle está interactuando principalmente con el servidor de Xorg. Me sorprende que espere que use muchas variables de entorno (excepto DISPLAY).

+0

Parece que este es el camino a seguir, pero hay un problema: no hay llamadas a getenv, pero sé con certeza que se accede a una variable de entorno (en una llamada a la biblioteca). Sin embargo, usando strace obtengo "execve ("/usr/bin/xprintidle ", [" xprintidle "], [/ * 41 vars * /]) como primera llamada. ¿Eso quiere decir que las variables no se obtienen a través de getenv? – Jost

+1

No - 'execve()' es siempre la forma en que se ejecutan los programas ('execl()' y los amigos son simplemente envoltorios sobre él), y su tercer argumento es una matriz de puntero de todas las variables de entorno. Verá esta llamada en todas y cada una de las etapas de un programa ejecutado. – fge

+0

Mencioné ** ltrace ** not * strace *; ¡Ellos no son los mismos! –

3

¿Se refiere a realmente accedido, o las variables de entorno definidas para un proceso?

Por medio definido, puede utilizar:

perl -pe 's,\00,\n,g' /proc/xxxx/environ

donde xxxx es el PID de su proceso.

Para las variables accedidas, tendrá que usar algo como ltrace y verificar las llamadas al getenv().

+0

' ltrace' no lo ayudará, ya que realmente no hay ninguna razón para llamar a 'getenv()' –

+0

¿Eh? Si desea acceder al valor de una variable de entorno, * debe * invocar 'getenv()'! – fge

+0

la mayoría de los programas acceden al entorno con 'getenv', por lo que' ltrace'-ing generalmente es útil (pero no siempre). Ver mi respuesta Algunos programas pueden obtener una variable de entorno usando 'environ' o el tercer argumento a' main'. ¡Muy pocos programas lo hacen en la realidad! –

0

Si desea que la lista de variables de entorno, a continuación, que se realiza mediante env

Pero determinar qué variables se accede por el programa es imposible, ya que todos son pasados ​​como son.

0

Puede ver las variables de entorno que pasan a su programa utilizando el comando printenv.

Una forma en que los programas pueden ver su entorno es utilizando la llamada getenv, por lo que podría usar un programa de rastreo o el truco LD_PRELOAD para ajustar esa llamada y descubrir qué es lo que están buscando.

Sin embargo, no todos los programas usan getenv para observar su entorno. Si el programa utiliza el formato siguiente (poco común) para las principales, se puede mirar las variables de entorno mediante el puntero envp:

int main(int argc, char *argv[], char *envp[]) { 
    /* ... */ 
} 

Además, los programas pueden tener acceso al ambiente a través de la variable environ.

Probablemente tengas suerte haciendo un seguimiento de las llamadas getenv, pero no es garantía --- varía de un programa a otro.

Cuestiones relacionadas