Mam instancję Linuksa, którą skonfigurowałem jakiś czas temu. Kiedy odpalam i loguję się, ponieważ root
skonfigurowałem zmienne środowiskowe, ale nie pamiętam ani nie wiem, skąd one pochodzą.
- Sprawdziłem
~/.bash_profile
,/etc/.bash_rc
i wszystkie skrypty startowe. - Uciekłem
find
igrep
bezskutecznie.
Czuję, że chyba zapominam patrzeć w jakieś oczywiste miejsce. Czy jest jakiś sposób, aby to rozgryźć?
/etc/environment
jest inny./etc/env.d/*
pliki. Ale robieniegrep -R "YOUR_VARIABLE" /etc/
jest prawdopodobnie najlepszym sposobem, aby się dowiedzieć.Odpowiedzi:
Jeśli użyjesz
env
polecenia 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, żeset
iexport
polecenia będą sortować swoje zmienne według kolejności alfabetycznej, tak, że lista nie jest tak skuteczna.źródło
Jeśli
zsh
twoja powłoka logowania:Z
bash
: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
script
polecenia, aby pomóc przechowywać cały wynik sesji powłoki, lub w przypadkubash
podejścia użyj7> file.log
zamiast,7>&2
aby zapisać danextrace
wyjściowefile.log
zamiast 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/environment
lub 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. Wtedyfind /etc -type f -exec grep -F THE_VAR {} +
może pomóc.źródło
zsh -xl 2>&1
, tzn. Połączysz stderr i stdout, możesz grep jak zwykle.fish
powłoki?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.PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>/tmp/$(uuidgen)
, a następnie grep również na tym losowym pliku.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ówSpecyficzne 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źródło
@ Cian ma rację. Poza używaniem
find
igrep
, 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ńVARIABLE
na odpowiednią zmienną, której szukasz:$ grep -r VARIABLE /etc/*
$ grep -r VARIABLE ~/.*
źródło
Jeśli wpiszesz
set -x
swoje.profile
lub.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 -x
na górze,/etc/profile
aby go prześledzić. Dane wyjściowe mogą być bardzo szczegółowe, więc możesz chcieć przekierować je do pliku z czymś takimexec 2>/tmp/profile.log
.Jeśli twój system używa PAM, poszukaj
pam_env
żądań ładowania w/etc/pam.conf
lub/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/environment
oraz/etc/security/pam_env.conf
w Debianie i Ubuntu). Innym plikiem z definicjami zmiennych środowiskowych w systemie Linux jest/etc/login.defs
(poszukaj linii zaczynających się odENV_
).źródło
Sprawdź, czy w skryptach startowych nie ma plików, które pozyskują za pomocą
.
(kropka) lubsource
. Pliki te mogą znajdować się w innych katalogach poza/etc
i$HOME
.źródło
Dla
zsh
uż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.źródło
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
źródło
/etc/profile
, można je zdefiniowaćbash
w 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ń.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:
źródło
echo "$HISTFILE"
:?set
nie mówi, który plik zdefiniował zmienną.