Qual é o melhor local para configurar variáveis ​​de ambiente em todo o sistema no Linux?

26

Eu só quero configurar uma variável de ambiente JAVA_HOMEpara todo o sistema, para todos os usuários, incluindo o usuário root .

Requisitos:

  • acessível a usuários normais
  • acessível para fazer root
  • sempre carregado, não apenas para o bash (o gnome-terminal não inicia um bash por padrão)
  • para trabalhar no Ubuntu, Debian e opcionalmente Red Hat
  • ótimo se a adição puder ser facilmente roteirizada
sorin
fonte
Para shells interativos, verifique este tópico do ubuntu .
Quickshiftin

Respostas:

26

Como ninguém adicionou uma resposta completa aqui é o que eu considero atualmente o melhor, pelo menos para o ubuntu, mas estou aberto a adaptar a resposta para outras plataformas * nix.

# **create**: /etc/profile.d/java.sh
export JAVA_HOME=/usr/lib/jvm/default-java

Outras opções que já foram consideradas, mas descartadas:

  • /etc/environment funciona, mas é mais difícil de manter, pois outras ferramentas ou pessoas podem editá-lo.
  • /etc/profile - o mesmo que acima
sorin
fonte
11

No Debian / Ubuntu isso seria / etc / environment

Não conheço o equivalente da Red Hat.

objetivado
fonte
1
Eu acredito / etc / ambiente está obsoleta
Pat James
@PatJames você tem mais informações sobre isso? Eu tentei / etc / environment não está carregado para raiz, mesmo depois de reiniciar a máquina.
sorin
@SorinSbarnea, aqui estão algumas informações: wiki.debian.org/Locale indicando que o / etc / environment não é mais usado em versões mais recentes
Pat James
1
Essa página diz apenas que você não deve deixar de incluir variáveis ​​relacionadas à localidade /etc/environment. Consulte também serverfault.com/a/584072/26218
Flow
11

Não entendo por que você descartou o / etc / profile. Essa é a localização correta.

dmourati
fonte
9

Alguns responderam dizendo que /etc/environmenté privado e / ou não é mais usado no Debian, e isso é (como na versão 7) falso.

O arquivo é realmente lido pelo PAM - especificamente pam_env(8), via padrão para o envfilesinalizador. A página de manual também indica esse padrão na seção FILES.

Os wikis citados (especialmente o código de idioma) apenas afirmam que as variáveis ​​de ambiente baseadas em código de idioma devem estar agora /etc/profile. Sua declaração "(em versões mais antigas do Debian, também / etc / environment)" é vaga e está no contexto de localidades.

Um grep rápido nos /etc/pam.dprogramas:

root@box:/etc/pam.d# grep pam_env.so *
atd:auth        required        pam_env.so
cron:session       required   pam_env.so
cron:session       required   pam_env.so envfile=/etc/default/locale
login:session       required   pam_env.so readenv=1
login:session       required   pam_env.so readenv=1 envfile=/etc/default/locale
sshd:auth       required     pam_env.so # [1]
sshd:auth       required     pam_env.so envfile=/etc/default/locale
su:session       required   pam_env.so readenv=1
su:session       required   pam_env.so readenv=1 envfile=/etc/default/locale

Essas linhas de configuração são aditivas e, como a primeira está faltando envfile, o padrão é /etc/environment.

Tudo isso, é claro, depende de qualquer binário que você esteja usando ( crond, shells de login etc.) compilados no PAM.

Finalmente, isso implica que outros sistemas que usam PAM (por exemplo, RedHat) se comportam da mesma forma, como pode ser visto em sua respectiva página de manual.

lingfish
fonte
2

Uma observação: dê uma olhada no ambiente dos módulos . Eu uso isso toda vez que tenho que oferecer um ambiente UNIX complexo, com versão, auto-extensível e conciso para dezenas ou centenas de usuários. É usado principalmente em ambientes HPC multiusuários em larga escala. Apenas usá-lo para uma variável em particular certamente é um excesso de engenharia, mas ele faz um trabalho incrível quando você precisa de mais do que alguns pacotes de software e seu ambiente.

pfo
fonte
1

/etc/profileDeveria trabalhar. Eu testei agora para ter certeza, coloque export SOMETEST=1234a /etc/profilee depois re-logging echo $SOMETESTme deu 1234como esperado. Também degnome-terminal

sem.
fonte
0

Você não pode usar ~ arquivos específicos neste caso. então....

/etc/profileseria o local apropriado para isso neste caso. Os usuários conectados no momento precisam ter uma nova sessão de login, mas isso não deve ser um grande problema.

@ wk01: /etc/profilepor padrão, não é carregado por um shell sem logon. você .bashrc provavelmente está carregando ...

mober
fonte