Como definir variável de ambiente para todos no meu sistema linux?

132

Posso ter certas configurações universais para todos os meus usuários?

TIMEX
fonte
2
É EXPORTAÇÃO? acrescentar isso e é global?
TIMEX
eu acho que é apenas de acréscimo na sessão atual, quando você abre nova sessão no Terminal seria desapareceu
Haryono Sariputra

Respostas:

104

Assim como /etc/profileoutros já mencionaram, alguns sistemas Linux agora usam um diretório /etc/profile.d/; todos os .sharquivos serão fornecidos por /etc/profile. É um pouco mais organizado manter essas coisas de ambiente personalizadas nesses arquivos do que apenas editar /etc/profile.

Kieron
fonte
4
E se alguns usuários usarem outro shell, como o zsh?
Matthieu Napoli
70
este não é global ... é restrita ao shell .. pena que é a resposta mais aceita
mmm
1
zsh será fonte arquivos .sh em /etc/profile.d/, você pode vê-lo a partir de / etc / zshrc @Matthieu Napoli
Bily
4
Os scripts não são usados ​​para o usuário ROOT.
Val
38

man 8 pam_env

man 5 pam_env.conf

Se todos os serviços de login usarem o PAM , e todos os serviços de login tiverem session required pam_env.soseus respectivos /etc/pam.d/*arquivos de configuração, todas as sessões de login terão algumas variáveis ​​de ambiente definidas conforme especificado no pam_envarquivo de configuração.

Na maioria das distribuições modernas de Linux, tudo está disponível por padrão - basta adicionar as variáveis ​​de ambiente global desejadas /etc/security/pam_env.conf.

Isso funciona independentemente do shell do usuário e também funciona para logins gráficos (se xdm / kdm / gdm / entrance /… estiver configurado assim).

efémero
fonte
1
+1, você também precisa reiniciar depois de adicionar uma variável no pam_env.conf, que causa instantaneamente instantaneamente $ echo $ variablename não
9
Você não precisa reiniciar, precisa se conectar novamente. (Não reiniciar servidores críticos para mim)
Lyndon Branco
Isso não parece se aplicar à minha distribuição, Mint 17.2. O arquivo pré-instalado é totalmente comentado e, se eu adicionar algo como echo foo>/home/me/bare reiniciar (e efetuar login novamente), esse arquivo não será criado. (Há provavelmente uma maneira mais elegante para testar isso, mas eu queria ter certeza antes de comentar aqui.)
Michael Scheper
16

Surpreendentemente, Unix e Linux não têm realmente um lugar para definir variáveis ​​de ambiente global. O melhor que você pode fazer é organizar para que qualquer shell específico tenha uma inicialização específica do site.

Se você o colocar /etc/profile, isso cuidará das coisas para a maioria dos usuários de shell compatíveis com posix. Isso provavelmente é "bom o suficiente" para fins não críticos.

Mas qualquer pessoa com um shell cshou tcshnão o verá, e não acredito que cshtenha um arquivo de inicialização global.

DigitalRoss
fonte
8
/etc/environmentna verdade, parece definir variáveis ​​de ambiente para mim, mesmo como usuário root. Eu sei que /etc/environmentestá no amazon linux e ubuntu. Não chequei se funciona para csh, tcsh ou zsh.
Jordan Stewart
não é específico para o shell que você está usando, é verdadeiramente global
Xerus
9

Alguns trechos interessantes da página de manual do bash:

Quando o bash é chamado como um shell de logon interativo ou como um shell não interativo com a --loginopção, ele primeiro lê e executa comandos do arquivo /etc/profile, se esse arquivo existir. Depois de ler esse arquivo, ele procura ~/.bash_profile, ~/.bash_logine ~/.profile, nessa ordem, e lê e executa os comandos do primeiro que existe e é legível. A --noprofileopção pode ser usada quando o shell é iniciado para inibir esse comportamento.
...
Quando um shell interativo que não é um shell de login é iniciado, o bash lê e executa comandos de /etc/bash.bashrce ~/.bashrc, se esses arquivos existirem. Isso pode ser inibido usando a --norcopção o--rcfileA opção file forçará o bash a ler e executar comandos do arquivo em vez de /etc/bash.bashrce ~/.bashrc.

Portanto, dê uma olhada /etc/profileou /etc/bash.bashrc, esses arquivos são os locais certos para configurações globais. Coloque algo assim neles para configurar uma variável de ambiente:

export MY_VAR=xxx
Pascal Thivent
fonte
Observe que nos sistemas Unix clássicos, tanto o shell Bourne quanto o shell Korn também lêem / etc / profile - é provavelmente o local mais usado para a configuração do ambiente do sistema. Algumas versões do shell C aparecem em /etc/csh.cshrc e /etc/csh.login, além de locais por usuário; outros não usam nenhum arquivo de configuração do ambiente do sistema.
31411 Jonathan Leffler
Incrível, exatamente o que eu estava procurando, tanto quanto definindo o ambiente para usuários de shell que não são de login.
David Mann
Desculpe, parece que eu votei acidentalmente isso quando, por um tempo, as setas não estavam visíveis ... você se importaria de editar isso (erro de digitação "environmentEment" na segunda à última linha, por exemplo) para que eu possa remover o voto negativo?
Benjamin W.
4

Usar o PAM é excelente.

# modify the display PAM
$ cat /etc/security/pam_env.conf 
# BEFORE: $ export DISPLAY=:0.0 && python /var/tmp/myproject/click.py &
# AFTER : $ python $abc/click.py &
DISPLAY  DEFAULT=${REMOTEHOST}:0.0 OVERRIDE=${DISPLAY}
abc   DEFAULT=/var/tmp/myproject

fonte
2

Todo processo em execução no kernel do Linux recebe seu próprio ambiente exclusivo, herdado de seu pai. Nesse caso, o pai será um próprio shell (gerando um sub shell) ou o programa 'login' (em um sistema típico).

Como o ambiente de cada processo é protegido, não há como injetar uma variável de ambiente em todos os processos em execução; portanto, mesmo se você modificar o shell .rc / profile padrão, ele não entrará em vigor até que cada processo saia e recarregue suas configurações de inicialização.

Procure em / etc / para modificar as variáveis ​​de inicialização padrão para qualquer shell em particular. Apenas perceba que os usuários podem (e costumam fazer) alterá-los em suas configurações individuais.

O Unix foi projetado para obedecer ao usuário, dentro de limites.

NB : O Bash não é o único shell no seu sistema. Preste muita atenção ao que o link simbólico / bin / sh realmente aponta. Em muitos sistemas, isso pode realmente ser um traço que está (por padrão, sem invocação especial) POSIXLY correto. Portanto, você deve modificar os padrões, ou os scripts que começam com / bin / sh não herdarão seus padrões globais. Da mesma forma, tome cuidado para evitar a sintaxe que apenas o bash entende ao editar os dois, também conhecido como avoiding bashisms.

Tim Post
fonte