Wenn ich mit rsync Dateien von einem Computer auf einen anderen kopiere, wird an beiden Enden ein rsync-Vorgang gestartet. Auf der Remote-Seite werden Shell-Initialisierungsdateien anscheinend nicht gelesen, sodass ich keine Umgebungsvariablen für den Remote-Rsync-Prozess einrichten kann. Leider gibt es einen Server, mit dem ich rsync muss, auf dem rsync eine Umgebungsvariable benötigt, um zu funktionieren. Ich bin kein Administrator auf dem Server, daher kann ich die globale Konfiguration nicht ändern. Was kann ich tun, um Umgebungsvariablen für einen Remote-Rsync-Prozess festzulegen?
ssh
rsync
environment-variables
remote-connection
Ryan C. Thompson
quelle
quelle
rsync localfilename remotehost:remotefilename
, wird ein Rsync-Prozess auf dem Server gestartet. Ich weiß nicht genau, wie, aber es werden keine Shell-Initialisierungsdateien gelesen.Antworten:
~/.profile
wird normalerweise nicht gelesen, wenn Siessh 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 einerAcceptEnv
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
Folgendesenvironment="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 derauthorized_keys
Datei (ab) zu verwenden . Ein Schlüssel mit einercommand
Option kann nur zum Ausführen des angegebenen Befehls verwendet werden. Der Befehl in derauthorized_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):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 ServerDann geben Sie
--rsync-path='bin/rsync-wrapper'
diersync
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 wirdsh
). Zsh liest immer~/.zshenv
.quelle
$PATH
in meinen Shell-Init-Skripten hinzufügen muss .PATH
zu berücksichtigen, sollten Sie in der Lage sein, dort eine andere Variable festzulegen. (Wenn dies nicht funktioniert, versuchen Sie, ausgehend von einemset -x
beliebigen Shell-Skript so viele Traces wie möglich hinzuzufügen . Ersetzen Sie diersync
Binärdatei durch ein Wrapper-Skript, das die Umgebung in eine Datei kopiert und dann die echte Binärdatei aufruft.)~/.ssh/rc
?~/.ssh/rc
wird von einem separaten Shell-Prozess ausgeführt. Ich denke, Ihre beste Wette ist ein Wrapper-Skript oder--rsync-path='. ~/.profile; rsync'
. Oder kompilieren Siersync
mit einem geeigneten Pfad gemäß Ihrer anderen Frage.