it-swarm-pt.tech

Como determinar de onde veio uma variável de ambiente?

Eu tenho uma instância do Linux que configurei há algum tempo. Quando eu inicio e faço login como root, algumas variáveis ​​de ambiente foram configuradas, mas não consigo me lembrar ou descobrir de onde elas vieram.

  • Eu verifiquei ~/.bash_profile, /etc/.bash_rc, e todos os scripts de inicialização.
  • Corri find e grep sem sucesso.

Sinto que devo estar esquecendo de parecer óbvio em algum lugar. Existe um truque para descobrir isso?

177
Joel

Se você usar o comando env para exibir as variáveis, elas deverão aparecer aproximadamente na ordem em que foram criadas. Você pode usar isso como um guia para saber se eles foram definidos pelo sistema muito cedo na inicialização ou por um arquivo .profile ou outro arquivo de configuração posterior. Na minha experiência, os comandos set e export classificarão suas variáveis ​​por ordem alfabética, para que a listagem não seja tão útil.

63
Ben Combee

Se zsh é seu Shell de login:

zsh -xl

Com bash:

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

Isso simulará um Shell de login e mostrará tudo o que é feito (exceto nas áreas em que o stderr é redirecionado com zsh) junto com o nome do arquivo atualmente sendo interpretado.

Portanto, tudo o que você precisa fazer é procurar o nome da sua variável de ambiente nessa saída. (você pode usar o comando script para ajudá-lo a armazenar toda a saída da sessão do Shell ou, para a abordagem bash, use 7> file.log ao invés de 7>&2 para armazenar a saída xtrace em file.log em vez de no terminal).

Se sua variável não estiver lá, provavelmente o Shell a herdou na inicialização, por isso foi definida antes, como na configuração do PAM, em ~/.ssh/environment, ou coisas lidas na inicialização da sessão do X11 (~/.xinitrc, ~/.xsession) ou defina a definição de serviço que iniciou seu gerenciador de login ou mesmo anteriormente em algum script de inicialização. Então uma find /etc -type f -exec grep -F THE_VAR {} + pode ajudar.

158
Stéphane Chazelas

Alguns lugares para procurar primeiro:

Todo o sistema

  • /etc/environment: especificamente destinado a variáveis ​​de ambiente
  • /etc/env.d/*: variáveis ​​de ambiente, divididas em vários arquivos
  • /etc/profile: todos os tipos de scripts de inicialização
  • /etc/profile.d/*: scripts de inicialização
  • /etc/bashrc, /etc/bash.bashrc: destinado a funções e aliases

Específico do usuário

  • ~/.bash_profile: inicialização para shells de login (bash-)
  • ~/.bashrc: inicialização para todos os shells interativos (bash-)
  • ~/.profile: usado para todas as conchas
  • ~/.cshrc, ~/.zshrc, ~/.tcshrc: semelhante para conchas que não sejam do tipo bash
65
beetstra

@Cian está correto. Além de usar find e grep, não há muito o que você pode fazer para descobrir de onde veio. Sabendo que é de fato uma variável de ambiente, tentarei focar sua pesquisa no/etc/e no seu diretório pessoal. Substitua VARIABLE pela variável apropriada que você está procurando:

$ grep -r VARIABLE /etc/*

$ grep -r VARIABLE ~/.*

34
Aaron Toponce

Se você colocar set -x na tua .profile ou .bash_profile, todos os comandos subsequentes do Shell serão registrados no erro padrão e você poderá ver se um deles define essas variáveis. Você pode colocar set -x no topo de /etc/profile para rastreá-lo também. A saída pode ser muito detalhada, portanto, você pode redirecioná-la para um arquivo com algo como exec 2>/tmp/profile.log.

Se o seu sistema usa o PAM, procure por pam_env carregar solicitações em /etc/pam.conf ou /etc/pam.d/*. Este módulo carrega variáveis ​​de ambiente dos arquivos especificados ou de um padrão do sistema se nenhum arquivo for especificado (/etc/environment e /etc/security/pam_env.conf no Debian e Ubuntu). Outro arquivo com definições de variáveis ​​de ambiente no Linux é /etc/login.defs (procure linhas começando com ENV_).

24

Verifique seus scripts de inicialização para arquivos que eles origem usando . (ponto) ou source. Esses arquivos podem estar em outros diretórios além de /etc e $HOME.

5

Para zsh usuários, o rastreamento dos arquivos que são acessados ​​(durante a inicialização) pode ser útil, eles não são muitos e é possível procurá-los um por um para descobrir onde algo foi definido.

zsh -o SOURCE_TRACE
4
Erik Zivkovic

variáveis ​​de ambiente são armazenadas no arquivo/etc/profile, faça mais/etc/profile e verifique as variáveis ​​de ambiente desejadas e se o/etc/profile não estiver presente, lokk para o arquivo .profile em seu diretório pessoal

0
Sarvesh Pawar