Variable d'environnement dans / etc / environment avec signe dièse (hachage) dans la valeur

10

Sur Ubuntu 12.04, j'ai une variable d'environnement définie /etc/environmentcomme ceci:

FOO="value_before#value_after"

Quand je ssh dans le serveur pour vérifier la valeur, j'obtiens ceci:

$ env | grep FOO
FOO=value_before

Je suppose qu'il traite le #comme un commentaire et le supprime, cependant, cela fonctionne:

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

J'ai essayé de m'échapper #comme ceci:

FOO="value_before\#value_after"

Mais cela ne fonctionne pas, au lieu de cela, je reçois juste ceci:

FOO=value_before\

Avez-vous des idées sur la façon de traiter le hachage comme faisant partie de la valeur? Toute aide est la bienvenue.

Valeurs que j'ai essayées dans le /etc/environmentfichier:

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'

Et d'autres combinaisons diverses de ce qui précède. Beaucoup de ceux-ci fonctionneront lorsque vous les placerez normalement dans le shell. Mais ils ne semblent pas fonctionner dans le /etc/environmentfichier.

Jaymon
la source

Réponses:

5

Ceci est lu par le module pam_env. Étant donné que le module pam_env s'attend à ce qu'elles soient des paires "simples" KEY = VALUE (n'a pas besoin de guillemets) et prend également en charge les commentaires identifiés par #, il suppose qu'un # et tout ce qui le suit dans une VALUE est un commentaire. Notez également qu'il ne prend en charge aucun concept d'échappement.

Cela peut être vu dans l'extrait de code suivant de la fonction _parse_env_file dans pam_env.c .

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

L'extrait ci-dessus parcourt chaque caractère de la partie VALUE jusqu'à ce qu'il trouve un \n, #ou \0. Il remplace ensuite ce caractère par un \0.

Cela supprime efficacement le #et tout ce qui suit. Remarque: il s'agit d'une fonctionnalité et non d' un bogue. C'est la fonction de commentaire.

Donc, à ce stade, vous ne pouvez pas avoir de valeurs /etc/environmentqui incluent un #ou un \nou \0au milieu de la valeur. Il semble également d'après le code que les clés doivent être alphanumériques.

Andrew De Ponte
la source
Whoa, cloué! Merci pour l'explication détaillée, j'ai marqué cela comme la solution acceptée.
Jaymon
3

Je n'ai jamais pu trouver un moyen de contourner cette limitation dans /etc/environment, la documentation semble indiquer qu'il /etc/environments'agit d'un simple fichier d'environnement:

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

Ce qui pourrait signifier qu'il ne vous permettra pas d'échapper des valeurs en utilisant des guillemets ou le \caractère, malgré d'autres endroits dans la documentation disant peut-être que c'est possible :

(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 peut-être pas :

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.

Quoi qu'il en soit, pour contourner cette limitation, j'ai déplacé mes variables d'environnement global dans un fichier /etc/profile.dcomme indiqué dans cette réponse . Je considère toujours cette question sans réponse, mais je voulais m'assurer qu'il y avait une solution de contournement liée pour la postérité.

Jaymon
la source
1

Il n'y a aucun moyen dans / etc / environment d'échapper au # (tel qu'il est traité comme un commentaire) car il est analysé par le module PAM "pam_env" et il le traite comme une simple liste de paires KEY = VAL et configure le environnement en conséquence. Ce n'est pas bash / shell, l'analyseur n'a pas de langage pour faire l'expansion des variables ou l'échappement des caractères.

Danila Ladner
la source
0

Guillemets simples.

$ FOO='foo#bar'
$ echo $FOO
foo#bar
Michael Hampton
la source
1
Ce fut l'une des premières valeurs que j'ai essayées, alors que cela fonctionne dans le shell, malheureusement, cela ne fonctionne pas /etc/environment, j'ai mis à jour ma question avec quelques exemples de valeurs que j'ai essayées.
Jaymon