Umgebungsvariable in / etc / environment mit Pfund (Hash) -Zeichen im Wert

10

Unter Ubuntu 12.04 habe ich eine Umgebungsvariable wie folgt definiert /etc/environment:

FOO="value_before#value_after"

Wenn ich auf den Server ssh, um den Wert zu überprüfen, erhalte ich Folgendes:

$ env | grep FOO
FOO=value_before

Ich vermute, es behandelt das #als Kommentar und entfernt es, aber das funktioniert:

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

Ich habe versucht, so zu entkommen #:

FOO="value_before\#value_after"

Aber das funktioniert nicht, stattdessen verstehe ich nur Folgendes:

FOO=value_before\

Irgendwelche Ideen, wie man den Hash als Teil des Wertes behandelt? Jede Hilfe wäre großartig.

Werte, die ich in der /etc/environmentDatei ausprobiert habe :

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'

Und andere verschiedene Kombinationen der oben genannten. Viele davon funktionieren, wenn Sie sie normalerweise in der Shell einstellen. Aber sie scheinen in der /etc/environmentDatei nicht zu funktionieren .

Jaymon
quelle

Antworten:

5

Dies wird vom Modul pam_env gelesen. Da das Modul pam_env erwartet, dass es sich um "einfache" KEY = VALUE-Paare handelt (keine Anführungszeichen erforderlich sind) und auch mit # gekennzeichnete Kommentare unterstützt, wird davon ausgegangen, dass ein # und alles, was in einem VALUE darauf folgt, ein Kommentar ist. Beachten Sie auch, dass es kein Konzept der Flucht unterstützt.

Dies ist im folgenden Ausschnitt aus der Funktion _parse_env_file in pam_env.c zu sehen .

/* 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';

Die obigen Schnipsel gehen jedes Zeichen des Wertteils , bis er ein findet \n, #oder \0. Es überschreibt dann dieses Zeichen mit einem \0.

Dies entfernt effektiv das #und alles, was folgt. Hinweis: Dies ist eine Funktion, kein Fehler. Es ist die Kommentarfunktion.

Zu diesem Zeitpunkt können Sie also keine Werte enthalten /etc/environment, die a #oder a \noder \0in der Mitte des Werts enthalten. Aus dem Code geht auch hervor, dass die Schlüssel alphanumerisch sein müssen.

Andrew De Ponte
quelle
Whoa, genagelt! Vielen Dank für die ausführliche Erklärung, ich habe dies als akzeptierte Lösung markiert.
Jaymon
3

Ich konnte nie einen Weg finden, um diese Einschränkung zu umgehen. In /etc/environmentder Dokumentation scheint es sich /etc/environmentum eine einfache Umgebungsdatei zu handeln:

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

Dies kann bedeuten, dass Sie den Werten nicht mit Anführungszeichen oder \Zeichen entkommen können , obwohl andere Stellen in der Dokumentation möglicherweise sagen, dass dies möglich ist :

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

Oder vielleicht auch nicht :

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.

Um diese Einschränkung zu umgehen, habe ich meine globalen Umgebungsvariablen /etc/profile.dwie in dieser Antwort beschrieben in eine Datei verschoben . Ich halte diese Frage immer noch für unbeantwortet, aber ich wollte sicherstellen, dass es eine verknüpfte Problemumgehung für die Nachwelt gibt.

Jaymon
quelle
1

In / etc / environment gibt es keine Möglichkeit, sich dem # zu entziehen (da es als Kommentar behandelt wird), da es vom PAM-Modul "pam_env" analysiert wird, und es wird als einfache Liste von KEY = VAL-Paaren behandelt und eingerichtet Umwelt entsprechend. Es ist keine Bash / Shell, der Parser hat keine Sprache für die Erweiterung von Variablen oder das Entkommen von Zeichen.

Danila Ladner
quelle
0

Einzelzitate.

$ FOO='foo#bar'
$ echo $FOO
foo#bar
Michael Hampton
quelle
1
Das war einer der ersten Werte, die ich ausprobiert habe, obwohl es in der Shell funktioniert. Leider funktioniert es nicht /etc/environment. Ich habe meine Frage mit einigen Beispielen für Werte aktualisiert, die ich ausprobiert habe.
Jaymon