ssh
Wie kann ich auf einem Server eine Umgebungsvariable vom Client an den Server übergeben? Diese Umgebungsvariable ändert sich zwischen verschiedenen Aufrufen von ssh, sodass ich nicht $HOME/.ssh2/environment
jedes Mal, wenn ich einen ssh-Aufruf mache, überschreiben möchte . Wie kann ich das machen?
ssh
environment-variables
Ross Rogers
quelle
quelle
ssh
Manpage sehe ich jedoch keine andere Möglichkeit, als die Variable manuell festzulegen, nachdem Sie sich beim Server angemeldet haben, es sei denn, Sie ändern ~ / .ssh2 / environment.Antworten:
Natürlich können Sie die Umgebungsvariable innerhalb des Befehls festlegen, aber Sie müssen vorsichtig sein, wenn Sie Anführungszeichen setzen: Denken Sie daran, dass Ihre Shell Ihre lokale Befehlszeile parsen wird, und dann wird die Remote-Shell die Zeichenfolge durchgehen erhält.
Wenn Sie möchten, dass eine Variable auf dem Server denselben Wert erhält wie auf dem Client, probieren Sie die folgende
SendEnv
Option aus:Dies erfordert jedoch Unterstützung vom Server. Bei OpenSSH muss der Variablenname in autorisiert werden
/etc/sshd_config
.Wenn der Server nur bestimmte Variablennamen zulässt, können Sie das umgehen. Ein allgemeines Setup ermöglicht beispielsweise
LC_*
Folgendes:Wenn gerade
LC_*
keine Option ist, können Sie Informationen in derTERM
Umgebungsvariablen übergeben, die immer kopiert wird (es kann jedoch eine Längenbeschränkung geben). Sie müssen weiterhin sicherstellen, dass die Remote-Shell dieTERM
Variable nicht einschränkt , um einen bekannten Terminaltyp zu bestimmen.-t
Übergeben Sie die Option an ssh, wenn Sie keine interaktive Remote-Shell starten.Eine andere Möglichkeit besteht darin, die Variable direkt im Befehl zu definieren:
Wenn Sie also eine lokale Variable übergeben, gilt Folgendes:
Achten Sie jedoch auf Anführungszeichen: Der Wert der Variablen wird direkt in das Shell-Snippet interpoliert, das auf der Remote-Seite ausgeführt wird. Das letzte Beispiel oben geht davon aus, dass
$LOCALVAR
keine einfachen Anführungszeichen ('
) enthalten sind.quelle
AcceptEnv
Anweisungen abgelehnt,sshd_config
wie vom Administrator gewünscht. WirdTERM
aber speziell behandelt, soweit ich weiß, gibt es keine Möglichkeit, es auf der Serverseite zu filtern (es wird in der Umgebung der Shell festgelegt, unabhängig von Konfigurationseinstellungen). Sind Sie sicher, dass es kein Profilskript gibt, das es überschreibt (wie/etc/profile
oder~/.profile
oder~/.bashrc
)?TERM
wird nur übertragen, wenn der Client den Server auffordert, ein tty zuzuweisen. Wenn es auf der Gegenseite kein Terminal gibt, wäre das Senden nutzlosTERM
. Wenn Sie einen Befehl angeben und ein Terminal auf der Remote-Seite haben möchten, benötigen Sie die-t
Befehlszeilenoption (oderRequestTTY
in~/.ssh/config
).Wenn Sie den Zielhost verwalten können, können Sie sshd so konfigurieren, dass Ihre lokalen Umgebungsvariablen an den Zielhost weitergeleitet werden.
Aus der Manpage sshd_config:
SSHD-Konfiguration lebt in der Regel bei
/etc/ssh/sshd_config
quelle
Sie haben also auf Ihrem Client eine Umgebungsvariable und möchten, dass diese für den Remote-Befehl verfügbar ist? Ich glaube nicht, dass es eine Möglichkeit gibt, ssh magisch weiterzugeben, aber Sie können wahrscheinlich so etwas tun. Anstatt zu verwenden, sagen Sie:
Du kannst das:
quelle
Die Antwort von @ emptyset (die bei mir nicht funktioniert hat) führte mich zu dieser Antwort:
Sie können diesen Befehl zu Ihrer
~/.ssh/authorized_keys
Datei hinzufügen :export VARIABLE=<something>
wurde sofort beendet und die SSH-Verbindung wurde geschlossen (wodurch ich vom Server ausgeschlossen wurde), während/usr/bin/env ... $SHELL
Ihre Standard-Shell mit einer geänderten Umgebung ausgeführt wird.quelle
$SHELL
eine aktuelle Shell zu ersetzen ? Überprüfen Sie auch, ob / usr / bin / env auf dem Server vorhanden ist. Die Lösung ist jedoch nicht perfekt: Ich habe gemerkt, dass es hängt, wenn ichscp
einen Inline-Befehl verwenden wollte.PermitUserEnvironment yes
undenvironment="..."
stattdessen verwendetcommand="..."
.Auf Ihrem lokalen Client können Sie in Ihrem
~/.ssh/config
hinzufügenSetEnv
, zHinweis: Überprüfen Sie
man ssh_config
.Stellen Sie dann auf dem Server sicher, dass der Client bestimmte Umgebungsvariablen in Ihrer
/etc/ssh/sshd_config
Konfigurationsdatei übergeben kann:Hinweis: Überprüfen Sie
man sshd_config
.quelle
Sie könnten versuchen, einen benutzerdefinierten Befehl aufzurufen, vorausgesetzt, Sie haben ein passwortloses SSH-Anmelde-Setup. Bearbeiten Sie auf dem Server Ihren ~ / .ssh / authorized_keys-Eintrag, der dem Schlüssel Ihres Clients entspricht:
Schauen Sie sich diesen Link im Abschnitt Erzwungener Befehl für ein wenig mehr Details an.
quelle
Ich habe einen benutzerdefinierten Build von OpenSSH für ein Gerät mit Cramfs im Ausgangsverzeichnis und / etc (Cram FS ist schreibgeschützt) erstellt, sodass ~ / .ssh / environment nicht funktionieren würde, ohne den gesamten FS neu zu erstellen, und diese wurden vor Ort bereitgestellt Geräte (Embedded Systems Daher die Verwendung von CRAMFS). Sie können in sshd_config den Speicherort der Datei authroized_keys angeben, aber aus irgendeinem Grund funktioniert environment = nur für Umgebungsvariablen in ~ / .ssh / authroized_keys. Das Bearbeiten der Datei / etc / profile war keine Option und ich musste ssh in ein nicht standardmäßiges Verzeichnis laden. Fügen Sie in session.c nach child_set_env (... "MAIL" ...) einfach die Umgebungsvariablen hinzu, die Sie benötigen (dies ist ein Hack, den ich kenne ...) Kompilieren aus dem Quellcode können Sie dies tun. TGI-FLOSS
quelle
nur ein einfacher Befehl:
quelle