~/.profilewird normalerweise nicht gelesen, wenn Sie ssh somecommandim 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 SendEnvDirektive in ~/.ssh/config. Die spezifische Umgebungsvariable muss jedoch mit einer AcceptEnvDirektive 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 PermitUserEnvironmentDirektive. 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_keysFolgendes 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_keysDatei (ab) zu verwenden . Ein Schlüssel mit einer commandOption kann nur zum Ausführen des angegebenen Befehls verwendet werden. Der Befehl in der authorized_keysDatei wird jedoch mit der Umgebungsvariablen ausgeführt, SSH_ORIGINAL_COMMANDdie 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-wrapperauf dem Server
#!/bin/sh
. ~/.profile
exec rsync "$@"
Dann geben Sie --rsync-path='bin/rsync-wrapper'die rsyncBefehlszeile weiter. Das Argument to --rsync-pathwird 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, ~/.bashrcwenn 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