Змінна середовище в / etc / environment з знаком фунт (хеш)


10

У Ubuntu 12.04 у мене є змінна середовища, визначена /etc/environmentтак:

FOO="value_before#value_after"

Коли я ssh на сервер, щоб перевірити значення, я отримую таке:

$ env | grep FOO
FOO=value_before

Я здогадуюсь, що це трактує #як коментар і знімає його, однак це працює:

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

Я намагався сховатися #так:

FOO="value_before\#value_after"

Але це не працює, натомість я просто отримую це:

FOO=value_before\

Будь-які ідеї, як зробити так, щоб хеш трактувався як частина цінності? Будь-яка допомога була б чудовою.

Значення, які я спробував у /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'

І інші різні комбінації перерахованого. Багато з них спрацює, коли ви просто встановите їх в оболонці. Але вони, схоже, не працюють у /etc/environmentфайлі.

Відповіді:


5

Це читається модулем pam_env. Зважаючи на те, що модуль pam_env очікує, що вони будуть "простими" KEY = VALUE парами (не потрібні лапки), а також підтримує коментарі, ідентифіковані #, він передбачає, що # і все, що слідує за ним у VALUE, є коментарем. Також зауважте, що вона не підтримує жодної концепції втечі.

Це можна побачити у нижченаведеному фрагменті функції _parse_env_file у 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';

Вищенаведений фрагмент обходить кожний символ частини VALUE, поки не знайде a \n, #або \0. Потім він перезаписує цей символ символом a \0.

Це ефективно позбавляє #і все наступне. Примітка. Це функція, а не помилка. Це особливість коментарів.

Отже, на даний момент у вас не може бути значень, /etc/environmentякі включають a #або a \nабо \0посередині значення. Також з коду схоже, що ключі повинні бути буквено-цифровими.


Ого, прибила його! Дякую за детальне пояснення, я позначив це як прийняте рішення.
Джеймон

3

Мені ніколи не вдалося знайти шлях до цього обмеження /etc/environment, але, здається, документація стверджує, що /etc/environmentце простий файл середовища:

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

Що може означати, що це не дозволить вам уникнути значень за допомогою лапок або \символів, незважаючи на інші місця в документації, можливо, сказати, що це можливо :

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

А може й ні :

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.

У будь-якому випадку, щоб обійти це обмеження, я перемістив свої глобальні змінні середовища у файл, /etc/profile.dяк обговорювалося у цій відповіді . Я все ще вважаю це питання без відповіді, але хотів переконатись, що існує відповідне рішення для нащадків.


1

Немає можливості в / etc / середовищі уникнути # (як це трактується як коментар), оскільки він розбирається модулем PAM "pam_env", і він трактує це як простий список пар KEY = VAL і встановлює оточення відповідно. Це не bash / shell, аналізатор не має мови для змінного розширення або виходу символів.


0

Одиночні цитати.

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

1
Це було одне з перших значень, які я спробував, хоча він працює в оболонці, на жаль, він не працює /etc/environment, я оновив своє запитання деякими прикладами значень, які я спробував.
Джеймон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.