it-swarm-ru.tech

Как определить, откуда появилась переменная окружения?

У меня есть экземпляр Linux, который я настроил некоторое время назад. Когда я запускаю его и регистрируюсь как root, я устанавливаю некоторые переменные окружения, но не могу вспомнить или найти, откуда они пришли.

  • Я проверил ~/.bash_profile, /etc/.bash_rc и ​​все сценарии запуска.
  • Я запустил find и ​​grep безрезультатно.

Я чувствую, что, должно быть, забываю посмотреть в каком-то месте очевидном. Есть ли хитрость для выяснения этого?

177
Joel

Если вы используете команду env для отображения переменных, они должны отображаться примерно в том порядке, в котором они были созданы. Вы можете использовать это как руководство к тому, были ли они установлены системой очень рано при загрузке, или более поздним .profile или другим файлом конфигурации. По моему опыту, команды set и ​​export сортируют свои переменные в алфавитном порядке, поэтому листинг не так полезен.

63
Ben Combee

Если zsh - ваша учетная запись Shell:

zsh -xl

С bash:

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

Это будет имитировать оболочку входа в систему и покажет все, что сделано (кроме областей, где stderr перенаправляется с zsh) вместе с именем файла, который интерпретируется в настоящее время.

Поэтому все, что вам нужно сделать, это найти имя вашей переменной среды в этом выводе. (вы можете использовать команду script, чтобы сохранить весь вывод сеанса Shell, или для подхода bash используйте 7> file.log вместо 7>&2 для сохранения вывода xtrace в file.log вместо терминала).

Если вашей переменной там нет, то, вероятно, оболочка унаследовала ее при запуске, поэтому она была установлена ​​ранее, как в конфигурации PAM, в ~/.ssh/environment, или что-то прочитанное при запуске вашего сеанса X11 (~/.xinitrc, ~/.xsession) или задайте определение службы, которое запускало ваш менеджер входа в систему, или даже раньше, в каком-нибудь загрузочном скрипте. Потом find /etc -type f -exec grep -F THE_VAR {} + может помочь.

158
Stéphane Chazelas

Некоторые места, чтобы посмотреть в первую очередь:

для всей системы

  • /etc/environment: специально предназначено для переменных среды
  • /etc/env.d/*: переменные среды, разделенные на несколько файлов
  • /etc/profile: все типы сценариев инициализации
  • /etc/profile.d/*: сценарии инициализации
  • /etc/bashrc, /etc/bash.bashrc: предназначен для функций и псевдонимов

зависит от пользователя

  • ~/.bash_profile: инициализация для оболочек входа в систему (bash-)
  • ~/.bashrc: инициализация для всех интерактивных (bash-) оболочек
  • ~/.profile: используется для всех оболочек
  • ~/.cshrc, ~/.zshrc, ~/.tcshrc: аналогично для небашковых оболочек
65
beetstra

@ Циан это правильно. Помимо использования find и ​​grep, вы мало что можете сделать, чтобы выяснить, откуда он взялся. Зная, что это действительно переменная окружения, я попытался бы сфокусировать ваш поиск в/etc/и вашем домашнем каталоге. Замените VARIABLE соответствующей переменной, которую вы ищете:

$ grep -r VARIABLE /etc/*

$ grep -r VARIABLE ~/.*

34
Aaron Toponce

Если вы поставите set -x в вашей .profile или .bash_profile, все последующие команды оболочки будут записаны со стандартной ошибкой, и вы можете увидеть, если одна из них устанавливает эти переменные. Вы можете поставить set -x на вершине /etc/profile чтобы отследить это. Вывод может быть очень подробным, поэтому вы можете перенаправить его в файл с чем-то вроде exec 2>/tmp/profile.log.

Если ваша система использует PAM, ищите pam_env загрузить запросы в /etc/pam.conf или /etc/pam.d/*. Этот модуль загружает переменные среды из указанных файлов или из системного значения по умолчанию, если файл не указан (/etc/environment а также /etc/security/pam_env.conf в Debian и Ubuntu). Другой файл с определениями переменных среды в Linux - это /etc/login.defs (ищите строки, начинающиеся с ENV_).

24
Gilles 'SO- stop being evil'

Проверьте ваши скрипты запуска на наличие файлов, которые они используют . (точка) или source. Эти файлы могут находиться в других каталогах, кроме /etc а также $HOME.

5
Paused until further notice.

Для пользователей zsh отслеживание файлов, к которым осуществляется доступ (во время запуска), может быть полезным, их не так много, и можно просмотреть их один за другим, чтобы найти, где что-то было определено.

zsh -o SOURCE_TRACE
4
Erik Zivkovic

переменные окружения хранятся в файле/etc/profile, поэтому сделайте больше/etc/profile и просто проверьте, какие переменные env вам нужны, а если/etc/profile отсутствует, то lokk для файла .profile в вашем домашнем каталоге

0
Sarvesh Pawar