In der Vergangenheit wurden die Profildateien ( /etc/profile
und ~/.profile
) beim Anmelden (auf der Textkonsole, was noch?) Aufgerufen und dienten vielen Zwecken:
- Legen Sie Umgebungsvariablen und andere Parameter (z. B. umask) für die Sitzung fest.
- Führen Sie zu Beginn der Sitzung zusätzliche Programme aus (z. B. E-Mail-Benachrichtigung).
- Führen Sie das Programm für die Sitzung aus, falls es sich von der Shell unterscheidet (z. B. eine andere Shell oder ein anderes X-Fenster).
- Stellen Sie die Terminalparameter ein (z
stty
. B. ).
- Stellen Sie Shell-Parameter ein (z. B. Aliase).
Alle diese Zwecke wurden erst später als getrennt identifiziert. Da die Profilskripte möglicherweise Dinge tun, die nur in einer interaktiven Sitzung sinnvoll sind (Terminalinteraktion, Starten anderer Programme), haben die Marken von rsh bei Einführung des Remote-Shell-Aufrufs ( rsh ) beschlossen, die Remote-Shell nicht als Anmeldeshell aufzurufen. damit die Profilskripte nicht ausgeführt werden. (Einige Versionen von rshd
haben die Option, die Remote-Shell als Anmeldeshell auszuführen.) Ssh hat dieses Verhalten kopiert, um als Drop-In-Ersatz für rsh zu fungieren.
Wenn Sie Ihre Profilskripte ausführen lassen möchten, können Sie sie explizit aufrufen.
ssh 127.0.0.1 '. /etc/profile; . ~/.profile; ydisplay'
Beachten Sie den Befehl .
zum Laden der Profilskripte in die Shell: Es handelt sich um Befehle, die in dieser Shell ausgeführt werden sollen, nicht um ein externes Programm.
Wenn Sie eine Umgebungsvariable global für alle Benutzer festlegen möchten, gibt es auf vielen Systemen eine andere Methode: Anstatt sie zu definieren /etc/profile
, definieren Sie sie in /etc/environment
. Diese Datei wird durch das pam_env
Modul gelesen . Die meisten Linux-Distributionen sind zum Lesen eingerichtet.
Wenn Ihre Login-Shell bash ist, gibt es eine weitere Möglichkeit. Normalerweise sollten Sie keine Umgebungsvariablen festlegen.bashrc
(da diese in X-Sitzungen nur festgelegt werden, wenn Sie ein Terminal mit einer interaktiven Shell durchlaufen, da sie nicht festgelegt werden, wenn Sie sich interaktiv an einer Textkonsole oder darüber anmelden ssh, weil sie benutzerdefinierte Einstellungen überschreiben, wenn Sie eine Shell in einem anderen Programm aufrufen). Bash hat jedoch eine seltsame Funktion, die ich nie verstanden habe: Es liest sich ~/.bashrc
unter zwei nicht zusammenhängenden Umständen:
- in interaktiven Shells, die keine Login-Shells sind;
- in nicht interaktiven Shells, die keine Login-Shells sind, wenn bash glaubt, dass sie von
rshd
oder aufgerufen wurden sshd
.
Wenn Sie einen Befehl über ssh ausführen, befinden Sie sich im zweiten Fall. Sie können veranlassen, dass Ihr Profil durch Lesen /etc/profile
und .profile
von gelesen wird .bashrc
. Fügen Sie den folgenden Code in Ihren ein ~/.bashrc
:
case $- in
*i*) :;; # this is an interactive shell, fine
*) # This is not an interactive shell! This must be a non-interactive remote shell session.
. /etc/profile; . ~/.profile
return;;
esac
ydisplay
? funktioniertssh 127.0.0.1 /usr/app/cpn/bin/ydisplay
?