Ich versuche, eine Variable an ssh remote zu übergeben, funktioniert aber nicht. Mein Code lautet:
#!/bin/bash
set -x
conexion="[email protected]"
parameter="$1"
ssh -T $conexion <<'ENDSSH'
clear
echo "$parameter"
ENDSSH
Ich führe aus:
./script.sh try
Es sagt mir:
parameter: Undefined variable.
Hilfe bitte?
shell-script
ssh
here-document
user650034
quelle
quelle
Antworten:
Das Übergeben von Variablen (Umgebungsvariablen)
ssh
ist möglich, aber im Allgemeinen eingeschränkt.Sie müssen den Client anweisen, sie zu senden. Zum Beispiel mit OpenSSH, das ist mit:
Sie benötigen aber auch den Server, der dies akzeptiert (
AcceptEnv
Konfigurationsanweisung mit OpenSSH). Das Akzeptieren einer Variablen stellt ein großes Sicherheitsrisiko dar und wird daher im Allgemeinen nicht standardmäßig durchgeführt, obwohl einige SSH-Bereitstellungen einige Variablen unter einem bestimmten Namespace zulassen (wieLC_*
in einigen OpenSSH-Bereitstellungen).Sie müssen die Variable auch exportieren, bevor Sie sie aufrufen
ssh
, z.Oben übergeben wir den Inhalt der
$parameter
bash
Shell-Variablen alsLC_parameter
Umgebungsvariable anssh
.ssh
sendet das ansshd
, das es, wenn es akzeptiert, als Umgebungsvariable an die Anmeldeshell des Benutzers übergibt, die es dann an diesencsh
Befehl weitergibt (der es dann erweitern kann).Wie bereits erwähnt, funktioniert dies nur, wenn der Administrator des
host
Computers der Konfiguration einAcceptEnv LC_parameter
oderAcceptEnv LC_*
(das manchmal standardmäßig erfolgt) hinzugefügt hatsshd
.Die
Undefined variable
Fehlermeldung in Ihrem Beispiel weist darauf hin, dass die Anmeldeshell des Remotebenutzerscsh
oder isttcsh
. Es ist besser, die Shell explizit aufzurufen, um Überraschungen zu vermeiden (ssh host csh
bedeutet auch, dass kein tty angefordert wird, sodass Sie es nicht benötigen-T
). Beachten Sie die$LC_parameter:q
Syntax, mit dercsh
der Inhalt einer Variablen wörtlich übergeben wird,"$LC_parameter"
die jedoch nicht funktioniert, wenn die Variable Zeilenumbrüche enthält.Wenn die Verwendung von
LC_*
Variablen keine Option ist, können Sie alternativ die Client- Shell (bash
in Ihrem Fall) die Variable erweitern lassen. Ein naiver Weg wäre mitDies wäre jedoch gefährlich, da der Inhalt der Variablen von der Remote-Shell interpretiert wird. Wenn
$variable
enthält`reboot`
oder"; reboot; : "
zum Beispiel, hätte das schlimme Konsequenzen.Sie müssen also zuerst sicherstellen, dass die Variable in der Syntax der Remote-Shell korrekt in Anführungszeichen gesetzt ist. Hier würde ich vermeiden,
csh
wo es schwierig ist, zuverlässig zu arbeiten, und stattdessensh
/bash
/ksh
verwenden.Verwenden Sie eine Hilfsfunktion, um das sh-Zitat auszuführen:
Und rufen Sie an
ssh
als:Sehen Sie, wie wir dem dritten entkommen,
$
sodass die Erweiterung$parameter
von der Remote-Shell und nicht von der lokalen Shell erfolgt.quelle
SendEnv
undAcceptEnv
wie mit dieser richtig geht eine Variable anstatt einen Wert . Genau darum wurde gebeten.Unter anderen Tricks (wie dem Übergeben von
LC_*
Umgebungsvariablen) können Sie Folgendes tun:Der Vorteil des Ansatzes besteht darin
export PARAMETER
, dass in der Konfiguration auf dem Remote-HostAcceptEnv
kein Name hinzugefügt werden muss (falls die Namen nicht von beginnenLC_
)/etc/ssh/sshd_config
undSendEnv
auf dem lokalen Host (zu-o
oder zu/etc/ssh/ssh_config
).quelle
Das Entfernen von Anführungszeichen aus
ENDSSH
der 4. Zeile sollte helfen.Mit freundlicher Genehmigung von @Archemar in Kommentaren zur Frage.
WARNUNG Wie von @ StéphaneChazelas im Kommentar zu dieser Antwort angegeben, würde diese Lösung dazu führen, dass die
$parameter
Variable im hier gezeigten Dokument um die lokale Shell erweitert wird, was bedeutet, dass der Inhalt der Variablen von der Remote-Shell als Shell-Code interpretiert wird Dies bedeutet, dass eine Sicherheitsanfälligkeit bezüglich Befehlsinjektion eingeführt wird. Im Allgemeinen wird davon abgeraten.quelle
$parameter
Variable im Here-Dokument von der lokalen Shell erweitert wird. Dies bedeutet, dass der Inhalt der Variablen von der Remote-Shell als Shell-Code interpretiert wird. Dies bedeutet, dass beispielsweise eine Sicherheitsanfälligkeit bezüglich Befehlsinjektion eingeführt wird, wenn der Wert von$parameter
ist nicht ganz unter Ihrer Kontrolle und Sie haben es nicht bereinigt.