~/.profile
wird nur von Login-Shells ausgeführt. Das Programm, das die Shell aufruft, entscheidet, ob die Shell eine Anmeldeshell ist (indem a -
als erstes Zeichen des nullten Arguments in den Shell-Aufruf eingefügt wird). Es wird normalerweise nicht ausgeführt, wenn Sie sich anmelden, um einen bestimmten Befehl auszuführen.
Insbesondere OpenSSH ruft eine Login-Shell nur auf, wenn Sie keinen Befehl angeben. Wenn Sie also einen Befehl angeben, ~/.profile
wird dieser nicht gelesen.
OpenSSH ermöglicht das Festlegen von Umgebungsvariablen auf der Serverseite. Dies muss in der Serverkonfiguration mit der PermitUserEnvironment
Direktive aktiviert werden . Die Variablen können in der Datei festgelegt werden ~/.ssh/environment
. Angenommen, Sie verwenden die Authentifizierung mit öffentlichem Schlüssel, können Sie auch Variablen pro Schlüssel in ~/.ssh/authorized_keys
: add environment="FOO=bar"
am Anfang der entsprechenden Zeile festlegen .
Ssh unterstützt auch das Senden von Umgebungsvariablen. Verwenden Sie in OpenSSH die SendEnv
Direktive in ~/.ssh/config
. Die spezifische Umgebungsvariable muss jedoch mit einer AcceptEnv
Anweisung in der Serverkonfiguration aktiviert werden, sodass dies für Sie möglicherweise nicht funktioniert.
Eine Sache, die meiner Meinung nach immer funktioniert (seltsamerweise), solange Sie die Authentifizierung mit öffentlichem Schlüssel verwenden, ist die (ab) Verwendung der command=
Option in der authorized_keys
Datei . Ein Schlüssel mit einer command
Option ist nur zum Ausführen des angegebenen Befehls geeignet. Der Befehl in der authorized_keys
Datei wird jedoch mit der Umgebungsvariablen ausgeführt, SSH_ORIGINAL_COMMAND
die auf den vom Benutzer angegebenen Befehl festgelegt ist. Diese Variable ist leer, wenn der Benutzer keinen Befehl angegeben hat und daher eine interaktive Shell erwartet. Sie können also so etwas in verwenden ~/.ssh/authorized_keys
(dies gilt natürlich nicht, wenn Sie diesen Schlüssel nicht zur Authentifizierung verwenden):
command=". ~/.profile; if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then eval \"$SSH_ORIGINAL_COMMAND\"; else exec \"$SHELL\"; fi" ssh-rsa …
Eine andere Möglichkeit besteht darin, Wrapper-Skripte auf den Server zu schreiben. So etwas wie das Folgende in ~/bin/ssh-wrapper
:
#!/bin/sh
. ~/.profile
exec "${0##*/}" "$@"
Dann machen Sie symbolische Links zu diesem Skript aufgerufen rsync
, unison
usw. Pass --rsync-path='bin/rsync'
auf der rsync
Kommandozeile, und so weiter für andere Programme. Alternativ können Sie mit einigen Befehlen ein ganzes Shell-Snippet angeben, das remote ausgeführt werden soll. Auf diese Weise können Sie den Befehl in sich geschlossen machen. Beispielsweise können Sie ihn mit rsync verwenden --rsync-path='. ~/.profile; rsync'
.
Es gibt noch eine andere Möglichkeit, die davon abhängt, ob Ihre Login-Shell bash oder zsh ist. Bash liest immer, ~/.bashrc
wenn es von rshd oder sshd aufgerufen wird, auch wenn es nicht interaktiv ist (aber nicht, wenn es als aufgerufen wird sh
). Zsh liest immer ~/.zshenv
.
## ~/.bashrc
if [[ $- != *i* ]]; then
# Either .bashrc was sourced explicitly, or this is an rsh/ssh session.
. ~/.profile
fi
## ~/.zshenv
if [[ $(ps -p $PPID -o comm=) = [rs]shd && $- != *l* ]]; then
# Not a login shell, but this is an rsh/ssh session
. ~/.profile
fi