2011-12-13 14 views
6

w środowisku Linux (w moim przypadku XUbuntu), czy istnieje sposób na sprawdzenie, które zmienne środowiskowe są dostępne za pomocą polecenia uruchamianego z konsoli?Dowiedz się, które zmienne środowiskowe używane przez komendę

Musi być możliwe uzyskanie informacji o tych zmiennych, ponieważ ktoś musi podać wartości do programu. Ale czy jest jakaś domyślna metoda, aby to zrobić?

Program, o którym tu mowa, to xprintidle.

Dzięki z góry, Jost

Odpowiedz

7

Zakładając chcesz zmienne faktycznie używane przez jakiś proces uruchamiania polecenia, można użyć ltrace i szukać połączeń do getenv

oczywiście argument do getenv puszka być obliczone (więc nie można tego naprawdę przewidzieć).

Jednak niektóre (stare lub dziwne) aplikacje mogą używać globalnego lub trzeciego opcjonalnego argumentu main; a niektóre aplikacje nawet zmieniają swoje środowisko, używając putenv, setenv lub unsetenv (wszystkie 3 są funkcjami libc, a nie wbudowanymi powłokami).

ale xprintidle w większości wchodzi w interakcję z serwerem Xorg. Jestem zaskoczony, że spodziewasz się używać wielu zmiennych środowiskowych (z wyjątkiem DISPLAY).

+0

Coś takiego wydaje się być drogą do rozwiązania, ale pojawia się problem: nie ma połączeń do getenv, ale wiem na pewno, że dostęp do zmiennej środowiskowej jest możliwy (w wywołaniu biblioteki). Jednak używając strace otrzymuję "execve ("/usr/bin/xprintidle ", [" xprintidle "], [/ * 41 vars * /])" jako pierwsze połączenie. Czy to oznacza, że ​​zmienne nie są pobierane przez getenv? – Jost

+1

Nie - 'execve()' jest zawsze sposobem, w jaki programy są wykonywane ('execl()' i przyjaciele są po prostu wrapperami), a jego trzeci argument jest tablicą wskaźników wszystkich zmiennych środowiskowych. Zobaczysz to połączenie w każdym kroku realizowanego programu. – fge

+0

Wspomniałem ** ltrace ** not * strace *; one nie są takie same! –

3

Masz na myśli faktyczny dostęp lub zdefiniowane zmienne środowiskowe dla procesu?

Dla określonym środowisku, można użyć:

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

gdzie xxxx jest PID procesu.

Aby uzyskać dostęp do zmiennych, musisz użyć czegoś takiego jak ltrace i sprawdzić połączenia pod numer getenv().

+0

' ltrace' nie pomoże, ponieważ tak naprawdę nie ma żadnego powodu, aby wywoływać 'getenv()' –

+0

Eh? Jeśli chcesz uzyskać dostęp do wartości zmiennej środowiskowej, musisz * wywołać 'getenv()'! – fge

+0

większość programów uzyskuje dostęp do środowiska, używając 'getenv', więc' ltrace'-jest zwykle (ale nie zawsze) pomocny. Zobacz moją odpowiedź. Niektóre programy mogą uzyskać zmienną środowiskową za pomocą 'environ' lub trzeciego argumentu' main'. Bardzo mało programów robi to w rzeczywistości! –

0

Jeśli chcesz listę zmiennych środowiskowych, to odbywa się za pomocą env

Ale określenie, które zmienne są dostępne w ramach programu jest niemożliwe, ponieważ wszystkie one są przekazywane jako oni.

0

Można przejrzeć zmienne środowiskowe przekazywane do programu przy użyciu polecenia printenv.

Jednym ze sposobów, w jaki programy mogą patrzeć na swoje środowisko, jest wywołanie getenv, dzięki czemu można użyć programu śledzącego lub sztuczki LD_PRELOAD, aby zawinąć to połączenie i dowiedzieć się, czego szukają.

Jednak nie wszystkie programy używają getenv, aby spojrzeć na swoje otoczenie. Jeżeli program wykorzystuje następujący format (niezbyt często) za główny, to może wyglądać w zmiennych środowiska poprzez wskaźnik envp:

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

Również programy mogą uzyskać dostęp do środowiska poprzez zmienną environ.

Prawdopodobnie będziesz mieć szczęście śledząc połączenia getenv, ale to nie gwarantuje - zależy od programu.

Powiązane problemy