La variabile d'ambiente in / etc / environment con cancelletto (cancelletto) firma il valore


10

Su Ubuntu 12.04, ho una variabile d'ambiente definita in /etc/environmentquesto modo:

FOO="value_before#value_after"

Quando accedo al server per verificare il valore, ottengo questo:

$ env | grep FOO
FOO=value_before

Immagino che stia trattando #un commento e rimuovendolo, tuttavia, funziona:

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

Ho provato a scappare #così:

FOO="value_before\#value_after"

Ma questo non funziona, invece ottengo solo questo:

FOO=value_before\

Qualche idea su come fare in modo che l'hash sia trattato come parte del valore? Qualsiasi aiuto sarebbe grande.

Valori che ho provato nel /etc/environmentfile:

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 altre varie combinazioni di quanto sopra. Molti di questi funzioneranno quando normalmente li inserirai nella shell. Ma non sembrano funzionare nel /etc/environmentfile.

Risposte:


5

Questo viene letto dal modulo pam_env. Dato che il modulo pam_env si aspetta che siano coppie KEY = VALUE "semplici" (non hanno bisogno di virgolette) e supporta anche i commenti identificati da #, si assume che un # e tutto ciò che lo segue in un VALUE siano un commento. Inoltre, tieni presente che non supporta alcun concetto di escape.

Questo può essere visto nel seguente frammento della funzione _parse_env_file in 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';

Lo snippet sopra riportato guida ogni carattere della porzione VALUE fino a trovare un \n, #o \0. Quindi sovrascrive quel personaggio con a \0.

Questo elimina efficacemente #tutto ciò che segue. Nota: questa è una funzione non un bug. È la funzione di commento.

Quindi, a questo punto non puoi avere valori /etc/environmentche includano a #o a \no \0nel mezzo del valore. Sembra anche dal codice che le chiavi debbano essere alfanumeriche.


Whoa, inchiodato! Grazie per la spiegazione dettagliata, l'ho contrassegnata come soluzione accettata.
Jaymon,

3

Non sono mai stato in grado di trovare un modo per aggirare questa limitazione /etc/environment, la documentazione sembra affermare che si /etc/environmenttratta di un semplice file di ambiente:

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

Il che potrebbe significare che non ti permetterà di sfuggire ai valori usando le virgolette o il \carattere, nonostante altri punti della documentazione possano forse dire che questo è possibile :

(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 ""

O forse no :

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.

Ad ogni modo, per aggirare questa limitazione, ho spostato le mie variabili di ambiente globali in un file /etc/profile.dcome discusso in questa risposta . Considero ancora questa domanda senza risposta, ma volevo assicurarmi che ci fosse una soluzione alternativa per i posteri.


1

In / etc / environment non c'è modo di sfuggire a # (visto che è trattato come un commento) mentre viene analizzato dal modulo PAM "pam_env" e lo tratta come un semplice elenco di coppie KEY = VAL e imposta il ambiente di conseguenza. Non è bash / shell, il parser non ha linguaggio per eseguire l'espansione variabile o caratteri di escape.


0

Virgolette singole.

$ FOO='foo#bar'
$ echo $FOO
foo#bar

1
Questo è stato uno dei primi valori che ho provato, mentre funziona nella shell, purtroppo, non funziona /etc/environment, ho aggiornato la mia domanda con alcuni esempi di valori che ho provato.
Jaymon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.