Für die Ausführung von Programmen ist es oft notwendig, dass
bestimmte Umgebungsvariablen gesetzt sind. Dies kann allgemeine
Variablen betreffen, wie z.B. den Suchpfad PATH oder
programmspezifische Variablen, wie z.B. ORACLE_HOME.
Die Frage ist, wie man eine Shell-Umgebung aufsetzt, so dass diese
möglichst universell nutzbar ist, insbesondere, wenn Programme auch
von außerhalb der eigenen interaktiven Sitzung, z.B. via cron,
sudo oder ssh ausgeführt werden sollen.
Die Shell (bash, ksh, sh) führt bei jedem Login die
nutzerspezifische Datei .profile aus. Werden in dieser Datei alle
Environment-Variablen gesetzt (und exportiert), kann die Umgebung
leicht in anderen Kontexten genutzt werden. Die Variablen in einer
rc-Datei (.bashrc oder .kshrc) zu setzen ist verkehrt, da der
Inhalt einer rc-Datei ausschließlich bei interaktiven Sitzungen
ausgeführt wird und daher ausschließlich Definitionen enthalten
sollte, die für eine Benutzerinteraktion mit der Shell relevant sind
(Beispielsweise: Aussehen des Prompt, Aliase, Länge der History,
Farben für ls(1), usw.).
TTY-Login, SSH Login
Dies ist der normale Anwendungsfall. Eine Login-Shell wird gestartet
und im Zuge dessen .profile ausgeführt.
Ausführung eines Remote-Kommandos per SSH
Das Remote-Kommando ersetzt in diesem Fall die Login-Shell. Wir sorgen
mit bash -l dafür, dass die Login-Umgebung hergestellt wird:
$ ssh USER@HOST "bash -lc 'COMMAND'"
X11 Terminal Window Login
Hier ist es wichtig, dass beim Öffnen des Terminals eine Login-Shell
ausgeführt wird. Ggf. ist es nötig, hierfür eine Option in den
Einstellungen zu aktivieren. In den Einstellungen des Xfce Terminals
heißt die Option "Run command as login shell", ist per Default
dekativert und sollte aktiviert werden.
sudo
Bei sudo sorgt die Option -i dafür, dass das Kommando an eine
Login-Shell übergeben wird:
cron, eigene crontab
Wie bei der Ausführung eines Remote-Kommandos per ssh sorgen wir
mit bash -l dafür, dass die Login-Umgebung vor Ausführung des
Kommandos hergestellt wird.
* * * * * bash -lc COMMAND
cron, fremde crontab
Anstelle der bash nutzen wir sudo (wie oben):
* * * * * sudo -iu USER COMMAND