Geschützte Umgebungsvariablen?

Geschützte Umgebungsvariablen?

Gibt es Namen von Umgebungsvariablen, die vom Benutzer/einem Aufruf von nicht überschrieben werden können setenv? Wenn ich POSIX1.2008 richtig verstehe, kann jeder Prozess den Umgebungsblock bearbeiten, muss aber das Überschreiben von Variablen wie LANG usw. vermeiden.

Antwort1

Die Umgebung ist eine Liste von Zeichenfolgen der Form var=value(vereinbarungs), das als drittes Argument an den Systemaufruf execve() übergeben wird .

Diese Liste wird irgendwo auf dem Stapel des Prozesses abgelegt, wenn dieser mit der Ausführung des neuen Befehls beginnt, genau wie die Argumentenliste (eine weitere Liste von Zeichenfolgen, die als zweites Argument an übergeben wird execve()).

In Programmen, die (die meisten) die libc verwenden, macht ein Initialisierungscode, der vor main()dem Aufruf der Funktion aufgerufen wird, diese Umgebungszeichenfolgen als environArray verfügbar.

Das libcstellt auch putenvFunktionen bereit setenv, die (eine Kopie) der Liste ändern können, die das Programm erhalten hat. Diese gepflegte, geänderte Kopie wird dann über die execvp()/ execl()/ system()/ popen()...-Funktionen der libc (die selbst den execve()Systemaufruf aufrufen) an den nächsten Befehl weitergegeben, der vom Prozess oder einem seiner untergeordneten Prozesse ausgeführt wird.

Wenn Sie nun eine Liste mit Zeichenfolgen erstellen, die Sie manuell an den execve()Systemaufruf übergeben, können Sie Zeichenfolgen wie foo(ohne =Zeichen) oder =bar(mit einem leeren Variablennamen) übergeben. setenvDies wird nicht zugelassen ( setenv("", "bar", 1)wird abgelehnt).

setenv("a=b", "c")wird ebenfalls abgelehnt. Daher haben die Zeichenfolgen, die durch definiert werden, setenvimmer das Format x=y, wobei xnicht leer sein darf.

Das ist so ziemlich die einzige Einschränkung (wird auch von angewendet putenv). Da es sich hierbei um mit NUL abgeschlossene Zeichenfolgen handelt, darf das NUL-Zeichen natürlich nicht im Variablennamen oder -wert vorkommen.

setenv("*", "x", 1), oder setenv("\n\n", "", 1)sind alle in Ordnung, soweit setenv()es den Kernel betrifft. Ob Sie damit nun etwas Nützliches tun können, ist eine andere Frage.

Antwort2

Nein, es gibt keine Einschränkungen, welche Umgebungsvariablen von einem Prozess geändert werden können. Beachten Sie jedoch, dass jeder Prozess seineeigenes Exemplarder geerbten Umgebung, und ein Prozess kann keine Umgebungsvariable in einem anderen Prozess ändern. Der setenvAufruf kann die Umgebung nur innerhalb des aufrufenden Prozesses ändern.

Antwort3

export MYENV=value
readonly MYENV

Antwort4

Ich denke, es hängt ganz von der Shell ab, die Sie ausführen.

In Bash UIDist BASH_VERSINFOlaut Manpage das eine das andere.

Andererseits in csh gemäß dem HandbuchUmgebungsvariablen können nicht schreibgeschützt gemacht werden.

verwandte Informationen