~/.profile
wird normalerweise nicht gelesen, wenn Sie ssh somecommand
im Gegensatz zu einer interaktiven SSH-Sitzung (oder einer anderen Anmeldemethode, bei der Sie eine interaktive Sitzung starten) ausgeführt.
Ssh unterstützt das Senden von Umgebungsvariablen. Verwenden Sie in OpenSSH die SendEnv
Direktive in ~/.ssh/config
. Die spezifische Umgebungsvariable muss jedoch mit einer AcceptEnv
Direktive in der Serverkonfiguration aktiviert werden , sodass dies für Sie möglicherweise nicht funktioniert.
OpenSSH ermöglicht auch das Setzen von Umgebungsvariablen auf der Serverseite. Auch dies muss in der Serverkonfiguration aktiviert werden, hier mit der PermitUserEnvironment
Direktive. Die Variablen können in der Datei eingestellt werden ~/.ssh/environment
. Angenommen, Sie verwenden die Authentifizierung mit öffentlichem Schlüssel, können Sie auch Variablen pro Schlüssel festlegen, indem Sie ~/.ssh/authorized_keys
Folgendes environment="FOO=bar"
am Anfang der betreffenden Zeile einfügen.
Eine Sache, von der ich denke, dass sie (seltsamerweise) immer funktioniert, solange Sie die Authentifizierung mit öffentlichen Schlüsseln verwenden, ist, die command=
Option in der authorized_keys
Datei (ab) zu verwenden . Ein Schlüssel mit einer command
Option kann nur zum Ausführen des angegebenen Befehls verwendet werden. 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 (leer für interaktive Sitzungen). So können Sie so etwas in verwenden ~/.ssh/authorized_keys
(es gilt natürlich nicht, wenn Sie diesen Schlüssel nicht zur Authentifizierung verwenden):
command="export LD_LIBRARY_PATH=\"$HOME\"/lib;
if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
eval \"$SSH_ORIGINAL_COMMAND\";
else exec \"$SHELL\"; fi" ssh-rsa …
Beachten Sie, dass ich aus Gründen der Lesbarkeit Zeilenumbrüche oben angefügt habe, aber dies muss tatsächlich in einer Zeile erfolgen.
Eine andere Möglichkeit ist das Schreiben eines Wrapper-Skripts ~/bin/rsync-wrapper
auf dem Server
#!/bin/sh
. ~/.profile
exec rsync "$@"
Dann geben Sie --rsync-path='bin/rsync-wrapper'
die rsync
Befehlszeile weiter. Das Argument to --rsync-path
wird durch eine Shell erweitert. Wenn Sie es vorziehen, können Sie die rsync-Befehlszeile in sich geschlossen machen, indem Sie so etwas wie übergeben --rsync-path='. ~/.profile; rsync'
.
Es gibt noch eine andere Möglichkeit, die davon abhängt, ob Ihre Anmeldeshell 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