Jak ustalić, skąd pochodzi zmienna środowiskowa?


153

Mam instancję Linuksa, którą skonfigurowałem jakiś czas temu. Kiedy odpalam i loguję się, ponieważ rootskonfigurowałem zmienne środowiskowe, ale nie pamiętam ani nie wiem, skąd one pochodzą.

  • Sprawdziłem ~/.bash_profile, /etc/.bash_rci wszystkie skrypty startowe.
  • Uciekłem findi grepbezskutecznie.

Czuję, że chyba zapominam patrzeć w jakieś oczywiste miejsce. Czy jest jakiś sposób, aby to rozgryźć?


6
/etc/environmentjest inny.
derobert

8
I /etc/env.d/*pliki. Ale robienie grep -R "YOUR_VARIABLE" /etc/jest prawdopodobnie najlepszym sposobem, aby się dowiedzieć.
rozcietrzewiacz


@rozcietrzewiacz najprostszy sposób ... jeśli zmienna rzeczywiście znajduje się gdzieś pod / etc / (jak w moim przypadku); jeśli zakładać go jako odpowiedź, chciałbym upvote;)
Linia

Odpowiedzi:


55

Jeśli użyjesz envpolecenia do wyświetlenia zmiennych, powinny one być wyświetlane mniej więcej w kolejności, w jakiej zostały utworzone. Możesz użyć tego jako przewodnika po tym, czy zostały ustawione przez system bardzo wcześnie podczas rozruchu, czy później .profile lub inny plik konfiguracyjny. Z mojego doświadczenia wynika, że seti exportpolecenia będą sortować swoje zmienne według kolejności alfabetycznej, tak, że lista nie jest tak skuteczna.


1
To świetnie ... ale próbuję dowiedzieć się, co usuwa zmienną środowiskową (ustawioną w / etc / environment). :-) (I tak, jest początkowo ustawiane ... Dodaję wiersze w skryptach w różnych, aby rejestrować, gdzie jest czyszczone ...)
Michael Scheper

127

Jeśli zshtwoja powłoka logowania:

zsh -xl

Z bash:

PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>&2

To symuluje powłokę logowania i pokazuje wszystko, co jest zrobione (z wyjątkiem obszarów, do których przekierowywany jest stderr zsh) wraz z nazwą pliku, który jest obecnie interpretowany.

Wszystko, co musisz zrobić, to poszukać nazwy zmiennej środowiskowej na tym wyjściu. (możesz użyć tego scriptpolecenia, aby pomóc przechowywać cały wynik sesji powłoki, lub w przypadku bashpodejścia użyj 7> file.logzamiast, 7>&2aby zapisać dane xtracewyjściowe file.logzamiast na terminalu).

Jeśli nie ma tam twojej zmiennej, prawdopodobnie powłoka odziedziczyła ją podczas uruchamiania, więc została ustawiona wcześniej, jak w konfiguracji PAM, w ~/.ssh/environmentlub podczas odczytu sesji podczas uruchamiania sesji X11 ( ~/.xinitrc, ~/.xsession) lub ustawiona w definicji usługi, która rozpoczęła logowanie menedżer lub nawet wcześniej w skrypcie rozruchowym. Wtedy find /etc -type f -exec grep -F THE_VAR {} +może pomóc.


4
Imponujące i pomocne, dziękuję. Czy dla nas, n00bs, wyjaśniłbyś nieco więcej na temat trybu i jak wydostać się z trybu, w którym się znajdujemy? Na przykład nie możemy po prostu potokować grep tego wyjścia.
Geoffrey Hale,

5
@GeoffreyHale jeśli ty zsh -xl 2>&1, tzn. Połączysz stderr i stdout, możesz grep jak zwykle.
Rakesh,

1
Czy można to zrobić za pomocą fishpowłoki?
Nick Sweeting,

Nawet jeśli używam zsh -xl 2>&1, jakoś nie mogę normalnie grepować. Wygląda na to, że dane wyjściowe nie zawierają odpowiednich nowych wierszy lub czegoś takiego.
Xerus

Myślę, że możesz po prostu użyć PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>/tmp/$(uuidgen), a następnie grep również na tym losowym pliku.
bd1251252

50

Niektóre miejsca, w których najpierw należy szukać:

System szeroki

  • /etc/environment: przeznaczony specjalnie dla zmiennych środowiskowych
  • /etc/env.d/*: zmienne środowiskowe, podzielone na wiele plików
  • /etc/profile: wszystkie typy skryptów inicjujących
  • /etc/profile.d/*: skrypty inicjujące
  • /etc/bashrc, /etc/bash.bashrc: przeznaczony dla funkcji i aliasów

Specyficzne dla użytkownika

  • ~/.bash_profile: inicjalizacja powłok logowania (bash-)
  • ~/.bashrc: inicjalizacja dla wszystkich interaktywnych powłok (bash-)
  • ~/.profile: używane dla wszystkich powłok
  • ~/.cshrc, ~/.zshrc, ~/.tcshrc: Podobne do powłok nie bash

31

@ Cian ma rację. Poza używaniem findi grep, niewiele możesz zrobić, aby dowiedzieć się, skąd pochodzi. Wiedząc, że jest to zmienna środowiskowa, spróbuję skoncentrować twoje wyszukiwanie w / etc / i twoim katalogu domowym. Zamień VARIABLEna odpowiednią zmienną, której szukasz:

$ grep -r VARIABLE /etc/*

$ grep -r VARIABLE ~/.*


1
Zaskakujące jest to, że odpowiedź, która mówi „nie możesz”, otoczona odpowiedziami „tak, możesz”, ma tak wiele pozytywnych opinii.
Michael Scheper,

Nie widzę żadnych odpowiedzi, które faktycznie pozwalałyby ustalić, GDZIE ustawiono zmienną. Istnieje kilka użytecznych wskazówek, ale nie ma jednej linijki, która mogłaby wykonać tę pracę.
Andrew Wagner,

To rozwiązało mój czas. Dzięki
Hassan Raza

@MichaelScheper „nie możesz” zrobić tego bez find / grep. w dalszej części „możesz” opisano, jak to zrobić ZA POMOCĄ grep
Line

23

Jeśli wpiszesz set -xswoje .profilelub .bash_profile, wszystkie kolejne polecenia powłoki zostaną zarejestrowane jako standardowe błędy i będziesz mógł zobaczyć, czy jedna z nich ustawia te zmienne. Możesz również umieścić set -xna górze, /etc/profileaby go prześledzić. Dane wyjściowe mogą być bardzo szczegółowe, więc możesz chcieć przekierować je do pliku z czymś takim exec 2>/tmp/profile.log.

Jeśli twój system używa PAM, poszukaj pam_envżądań ładowania w /etc/pam.conflub /etc/pam.d/*. Ten moduł ładuje zmienne środowiskowe z określonych plików lub z domyślnego systemu, jeśli nie określono żadnego pliku ( /etc/environmentoraz /etc/security/pam_env.confw Debianie i Ubuntu). Innym plikiem z definicjami zmiennych środowiskowych w systemie Linux jest /etc/login.defs(poszukaj linii zaczynających się od ENV_).


5

Sprawdź, czy w skryptach startowych nie ma plików, które pozyskują za pomocą .(kropka) lub source. Pliki te mogą znajdować się w innych katalogach poza /etci $HOME.


2

Dla zshużytkowników śledzenie dostępu do plików (podczas uruchamiania) może być przydatne, nie jest ich zbyt wiele i można je przeglądać jeden po drugim, aby znaleźć miejsce, w którym coś zostało zdefiniowane.

zsh -o SOURCE_TRACE

0

zmienne środowiskowe są przechowywane w pliku / etc / profile, więc zrób więcej / etc / profile i po prostu sprawdź, jakie zmienne env chcesz, a jeśli / etc / profile nie jest obecny, to lokk dla pliku .profile w katalogu domowym


1
Zmienne środowiskowe nie są przechowywane /etc/profile, można je zdefiniować bashw całym systemie, np. Gdy są używane jako powłoka logowania. Są one przechowywane przez proces powłoki po odczytaniu definicji z plików i / lub wiersza poleceń.
Anthon

-2

Na przykład, jeśli chcesz znaleźć zmienną HISTFILE i jej wartość lub chcesz wiedzieć, które zmienne są zdefiniowane w historii, wpisz ją w powłoce:

set | grep HIST
env | grep HIST
printenv | grep HIST

jeśli znasz już nazwę, dlaczego nie echo "$HISTFILE":?
Jeff Schaller

ponieważ chcemy znaleźć, gdzie zdefiniowana jest zmienna $ HISTFILE. Także jeśli chcę wiedzieć, które zmienne są zdefiniowane w historii
Vusal Aliyev

2
Niestety setnie mówi, który plik zdefiniował zmienną.
Jeff Schaller
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.