Environmentvariable Setzen

29/08/2009 - 18:00 von David Dahlberg | Report spam
Hallo,

ich habe folgendes wiederkehrendes Problem: Ich bewege mich mit einem
Laptop durch verschiedenen Netze. In manchen brauche ich einen Web-Proxy,
in anderen nicht.

Setze ich in Netzen, in denen ein Proxy notwendig ist, die entsprechenden
Variablen (http_proxy et al.), erkennen die meisten Anwendungen (z.B.
wget, apt, Opera) dies und honorieren ihn entsprechen.
Würde ich mich immer mit dem gleichen Netz verbinden, könnte ich die
Variablen entsprechend in der profile oder environment etc. setzen. Aber
wechsle ich in ein anderes Netz, müssen die Variablen umgesetzt werden
und das global -- d.h. für alle neuen und am liebsten auch alle laufenden
Shells. Frage: Ist das möglich?

"export" exportiert eine Variable ja leider nur in Subshells. Meine beste
Idee bisher: aus der /etc/profile eine /etc/proxies sourcen und dort die
Variablen setzen. Gibt es bessere Möglichkeiten/Ideen?

Vielen Dank schonmal

David
 

Lesen sie die antworten

#1 Markus Wichmann
29/08/2009 - 21:32 | Warnen spam
David Dahlberg wrote:
Hallo,

ich habe folgendes wiederkehrendes Problem: Ich bewege mich mit einem
Laptop durch verschiedenen Netze. In manchen brauche ich einen Web-Proxy,
in anderen nicht.

Setze ich in Netzen, in denen ein Proxy notwendig ist, die entsprechenden
Variablen (http_proxy et al.), erkennen die meisten Anwendungen (z.B.
wget, apt, Opera) dies und honorieren ihn entsprechen.
Würde ich mich immer mit dem gleichen Netz verbinden, könnte ich die
Variablen entsprechend in der profile oder environment etc. setzen. Aber
wechsle ich in ein anderes Netz, müssen die Variablen umgesetzt werden
und das global -- d.h. für alle neuen und am liebsten auch alle laufenden
Shells. Frage: Ist das möglich?

"export" exportiert eine Variable ja leider nur in Subshells.



Kurz: Mehr ist auch nicht drin.

Lang: Ein laufender Prozess kann nur von sich aus sein Environment
àndern. Änderung von außen ist unmöglich (außer du spielst an /dev/mem
rum, aber das lassen wir lieber). Das heißt also, dass deine Shell nur
ihr eigenes Environment àndern kann. Und dieses wird dann an
Kindprozesse vererbt.

Meine beste
Idee bisher: aus der /etc/profile eine /etc/proxies sourcen und dort die
Variablen setzen. Gibt es bessere Möglichkeiten/Ideen?




Hm...

Wenn man mal ein bisschen drüber nachdenkt, wird es ganz logisch: Das
einzige Programm, dass sein Environment entsprechend Nutzerwünschen
anpassen kann, ist eine Shell. Demzufolge müsstest du eine Möglichkeit
finden, den schon laufenden Shells zu sagen, dass sie ihr Environment
neu einlesen müssen. Die Lösung: Signale. Du schreibst sowas wie

trap 'source /etc/proxyconf' USR1

in die /etc/profile (das Kommando ist POSIX). Dabei ist /etc/proxyconf
ein Symlink auf eine Datei

- /etc/proxy-NetzA oder
- /etc/proxy-NetzB

die mit den entsprechenden Einstellungen versehen sind

export http_proxy=what_so_ever #et al.
#bzw.
unset http_proxy

Alles, was du nun noch tun musst, ist, den Symlink je nach Situation zu
aktualisieren und dann

sudo killall -USR1 bash zsh sh ksh #und welche Shells sonst
#noch so laufen könnten

(sudo ist nötig, damit _alle_ Shells ihr env updaten, nicht nur die
Shells des lokalen Benutzers. Falls unnötig, streichen.)

Jeder jetzt neu durch diese Shells gestartete Prozess sollte das neue
Environment haben. Jedoch kann es sein, dass du einen Prozess auf andere
Weise startest, sodass er immer noch das alte Env hat. Da kann man
nichts machen.

Vielen Dank schonmal

David





HTH,
Markus
GUI - ein Hintergrundbild und zwölf XTerms

vim -c "exec \"norm iwHFG#NABGURE#IVZ#UNPXRE\"|%s/#/ /g|norm g??g~~"

Ähnliche fragen