2011-12-13 18 views
6

in un ambiente Linux (nel mio caso XUbuntu), c'è un modo per scoprire quali variabili d'ambiente sono accessibili da un comando che viene eseguito dalla console?Scopri quali variabili d'ambiente usate da un comando

Deve essere possibile scoprire queste variabili, poiché qualcuno deve fornire i valori al programma. Ma c'è qualche metodo predefinito per farlo?

Il programma in questione è xprintidle.

Grazie in anticipo, Jost

risposta

7

supponendo che si desidera le variabili effettivamente utilizzate da qualche processo in esecuzione di un comando, è possibile utilizzare ltrace e cercare per le chiamate a getenv

Naturalmente, l'argomento getenv può essere calcolato (quindi non puoi davvero prevederlo).

Tuttavia, alcune (vecchie o strane) applicazioni potrebbero utilizzare il environ globale o il terzo argomento facoltativo a main; e alcune applicazioni cambiano anche il loro ambiente usando putenv, setenv o unsetenv (tutte e 3 sono le funzioni di libc, non la shell integrata).

ma xprintidle interagisce principalmente con il server Xorg. Sono sorpreso che ti aspetti che usi molte variabili d'ambiente (eccetto lo DISPLAY).

+0

Qualcosa del genere sembra essere la strada da percorrere, ma c'è un problema: non ci sono chiamate a getenv, ma so per certo che si accede a una variabile d'ambiente (in una chiamata alla biblioteca). Tuttavia, usando strace ottengo "execve ("/usr/bin/xprintidle ", [" xprintidle "], [/ * 41 vars * /])" come prima chiamata. Ciò significa che le variabili non vengono recuperate tramite getenv? – Jost

+1

No - 'execve()' è sempre il modo in cui i programmi vengono eseguiti ('execl()' e gli amici sono solo wrapper su di esso), e il suo terzo argomento è un array di puntatori di tutte le variabili di ambiente. Vedrai questa chiamata in ogni file di un programma eseguito. – fge

+0

Ho menzionato ** ltrace ** not * strace *; non sono la stessa cosa! –

3

Intendi effettivamente l'accesso o le variabili di ambiente definite per un processo?

Per ambiente definito, è possibile utilizzare:

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

dove xxxx è il PID del processo.

Per le variabili accessibili, è necessario utilizzare qualcosa come ltrace e verificare le chiamate a getenv().

+0

' ltrace' non ti aiuterà, dato che non c'è davvero alcun motivo per chiamare 'getenv()' –

+0

Eh? Se vuoi accedere al valore di una variabile d'ambiente, * devi * chiamare 'getenv()'! – fge

+0

la maggior parte dei programmi accede all'ambiente usando 'getenv', quindi' ltrace'-it è di solito (ma non sempre) utile. Vedi la mia risposta. Alcuni programmi potrebbero ottenere una variabile di ambiente usando 'environ' o il terzo argomento a' main'. Pochissimi programmi lo fanno nella realtà! –

0

Se si desidera che l'elenco delle variabili d'ambiente, quindi questo è fatto usando env

Ma determinare quali variabili si accede dal programma è impossibile, dal momento che sono tutti passati come sono.

0

È possibile esaminare le variabili di ambiente passate al programma utilizzando il comando printenv.

Un modo in cui i programmi possono guardare al proprio ambiente è utilizzando la chiamata getenv, in modo da poter utilizzare un programma di traccia o il trucco LD_PRELOAD per avvolgere quella chiamata e capire cosa stanno cercando.

Tuttavia, non tutti i programmi utilizzano getenv per esaminare l'ambiente. Se il programma utilizza il seguente formato (non comune) per il principale, può guardare le variabili di ambiente attraverso il puntatore envp:

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

Inoltre, i programmi possono accedere all'ambiente attraverso la variabile environ.

Probabilmente avrai fortuna tracciando le chiamate getenv, ma non è garantito --- varia da programma a programma.