Por que a persistência da variável de ambiente quebra o PATH var?

3

Eu tentei persistir as variáveis de ambiente para o ORACLE no RedHat usando /etc/environment .

Desmarcou minha variável PATH ; nenhum comando foi reconhecido depois.

Por que isso acontece, já que apenas executar os mesmos comandos no shell funciona bem ?!

O conteúdo do meu /etc/environment :

ORACLE_HOME=/usr/lib/oracle/12.1/client64
PATH=$ORACLE_HOME/bin:$PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib
    
por Skip 26.04.2016 / 10:05

2 respostas

7

/etc/environment é um arquivo de configuração para pam_env , não um arquivo lido por um shell. A sintaxe é um pouco semelhante, mas não é a mesma. Em particular, você não pode se referir a variáveis existentes: você definiu seu caminho de pesquisa para conter $ORACLE_HOME/bin e $PATH , ou seja, diretórios com um cifrão em seu nome.

Para definir variáveis para todos os usuários, você pode editar /etc/security/pam_env.conf , que tem uma sintaxe diferente e mais rica, mas ainda não tão rica quanto o que você pode fazer em um shell.

ORACLE_HOME DEFAULT=/usr/lib/oracle/12.1/client64
PATH OVERRIDE=/usr/local/bin:/usr/bin:/bin:${ORACLE_HOME}/bin
LD_LIBRARY_PATH DEFAULT=$ORACLE_HOME/lib

Note que você pode se referir a outras variáveis, mas não pode se referir ao valor anterior de uma variável.

Se você quiser uma abordagem mais flexível, adicione as definições das variáveis a /etc/profile . Lá você pode usar todas as construções de shell. A desvantagem é que isso é lido apenas em sessões de login, não, e. por cron. Você pode facilmente se beneficiar deles adicionando . /etc/profile; no início de seus trabalhos cron.

export ORACLE_HOME=/usr/lib/oracle/12.1/client64
PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
    
por 27.04.2016 / 02:45
2

As atribuições em /etc/environment devem ser exportadas . Caso contrário, seus valores não serão usados. Se você usar "." para criar um arquivo, você usaria essa sintaxe:

export ORACLE_HOME=/usr/lib/oracle/12.1/client64
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib

Mas, conforme observado, /etc/environment não deve ser originado (veja, por exemplo, Defina persistentemente o valor de uma variável de ambiente para todos os usuários ).

De acordo com 6.6. pam_env - set / unset variáveis de ambiente (O Guia de Administradores do Sistema Linux-PAM):

The pam_env PAM module allows the (un)setting of environment variables. Supported is the use of previously set environment variables as well as PAM_ITEMs such as PAM_RHOST.

By default rules for (un)setting of variables is taken from the config file /etc/security/pam_env.conf if no other file is specified.

This module can also parse a file with simple KEY=VAL pairs on separate lines (/etc/environment by default). You can change the default file to parse, with the envfile flag and turn it on or off by setting the readenv flag to 1 or 0 respectively.

Since setting of PAM environment variables can have side effects to other modules, this module should be the last one on the stack.

Ou seja, o PAM (que autentica usuários) lê esse arquivo, e parece que, se ele não entender o valor que você definiu, definirá a variável como nothing .

Se você tivesse modificado /etc/profile , teria obtido melhores resultados. Mas lendo o comentário no topo do arquivo:

# /etc/profile

# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc

# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.

você obteria resultados ainda melhores criando um arquivo /etc/profile.d/custom.sh com suas configurações.

No entanto, você pode ter problemas com a configuração LD_LIBRARY_PATH . Em vez disso, você deve adicionar o diretório à configuração por meio de /etc/ld.so.conf.d , por exemplo, como um arquivo, por exemplo, /etc/ld.so.conf.d/oracle contendo o caminho:

/usr/lib/oracle/12.1/client64/lib

Leitura adicional:

por 26.04.2016 / 10:41