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.