Variável de ambiente em / etc / environment com libra (hash) entre no valor

9

No Ubuntu 12.04, eu tenho uma variável de ambiente definida em /etc/environment assim:

FOO="value_before#value_after"

Quando eu ssh no servidor para verificar o valor, eu recebo isso:

$ env | grep FOO
FOO=value_before

Acredito que esteja tratando o # como um comentário e removendo-o, no entanto, isso funciona:

$ . /etc/environment
$ export FOO
$ env | grep FOO
FOO=value_before#value_after

Eu tentei escapar do # assim:

FOO="value_before\#value_after"

Mas isso não funciona, em vez disso eu só entendo isso:

FOO=value_before\

Alguma idéia de como fazer o hash ser tratado como parte do valor? Qualquer ajuda seria ótima.

Valores que eu tentei no arquivo /etc/environment :

FOO='value_before#value_after'
FOO="value_before#value_after"
FOO='"value_before#value_after"'
FOO="value_before\#value_after"
FOO='value_before\#value_after'

E outras várias combinações dos itens acima. Muitos deles funcionarão quando você normalmente os coloca no shell. Mas eles não parecem funcionar no arquivo /etc/environment .

    
por Jaymon 18.09.2013 / 02:11

4 respostas

5

Isso é lido pelo módulo pam_env. Dado que o módulo pam_env espera que eles sejam pares "simples" KEY = VALUE (não precisa de aspas) e também suporta comentários identificados por #, ele assume que um # e qualquer coisa após ele em um VALUE são um comentário. Além disso, observe que ele não suporta nenhum conceito de escape.

Isso pode ser visto no snippet a seguir da função _parse_env_file em pam_env.c .

/* now find the end of value */
mark = key;
while(mark[0] != '\n' && mark[0] != '#' && mark[0] != '
/* now find the end of value */
mark = key;
while(mark[0] != '\n' && mark[0] != '#' && mark[0] != '%pre%')
    mark++;
if (mark[0] != '%pre%')
    mark[0] = '%pre%';
') mark++; if (mark[0] != '%pre%') mark[0] = '%pre%';

O snippet acima percorre cada caractere da parte do VALUE até encontrar um \n , # ou # . Em seguida, ele substitui esse caractere por um /etc/environment .

Isso remove efetivamente o # e tudo o que se segue. Nota: Este é um recurso não de um erro. É o recurso de comentário.

Portanto, neste ponto, você não pode ter valores em \n que incluam %code% ou %code% ou %code% no meio do valor. Também parece do código que as chaves precisam ser alfanuméricas.

    
por 17.09.2015 / 21:28
2

Eu nunca consegui encontrar uma maneira de contornar essa limitação em /etc/environment , a documentação parece indicar que /etc/environment é um simples arquivo de ambiente:

This module can also parse a file with simple KEY=VAL pairs on separate 
lines (/etc/environment by default).

O que pode significar que ele não permitirá que você escape de valores usando aspas ou o caractere \ , apesar de outros locais no documentação talvez dizendo que isso é possível :

(Possibly non-existent) environment variables may be used in values using 
the ${string} syntax and (possibly non-existent) PAM_ITEMs may be used in 
values using the @{string} syntax. Both the $ and @ characters can be 
backslash escaped to be used as literal values values can be delimited with ""

Ou talvez não :

The file is made up of a list of rules, each rule is typically placed on a
single line, [...] Comments are preceded with '#´ marks and extend to the 
next end of line.

De qualquer forma, para contornar essa limitação, mudei minhas variáveis de ambiente global para um arquivo em /etc/profile.d como discutido nesta resposta . Ainda considero essa questão sem resposta, mas queria ter certeza de que havia uma solução vinculada para a posteridade.

    
por 20.09.2013 / 02:36
1

Não existe nenhuma maneira em / etc / environment para escapar do # (como tratado como um comentário) pois ele está sendo analisado pelo módulo PAM "pam_env" e o trata como uma simples lista de pares KEY = VAL e configura o ambiente de acordo. Não é bash / shell, o analisador não possui linguagem para fazer expansão de variáveis ou caracteres que escapam.

    
por 20.09.2013 / 02:52
0

Aspas simples.

$ FOO='foo#bar'
$ echo $FOO
foo#bar
    
por 18.09.2013 / 02:15