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:
ssh -o SendEnv=parameter host cmd...
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 (wie LC_*
in einigen OpenSSH-Bereitstellungen).
Sie müssen die Variable auch exportieren, bevor Sie sie aufrufen ssh
, z.
LC_parameter="$parameter" ssh -o SendEnv=LC_parameter host csh << 'END'
echo $LC_parameter:q
END
Oben übergeben wir den Inhalt der $parameter
bash
Shell-Variablen als LC_parameter
Umgebungsvariable an ssh
. ssh
sendet das an sshd
, das es, wenn es akzeptiert, als Umgebungsvariable an die Anmeldeshell des Benutzers übergibt, die es dann an diesen csh
Befehl weitergibt (der es dann erweitern kann).
Wie bereits erwähnt, funktioniert dies nur, wenn der Administrator des host
Computers der Konfiguration ein AcceptEnv LC_parameter
oder AcceptEnv LC_*
(das manchmal standardmäßig erfolgt) hinzugefügt hat sshd
.
Die Undefined variable
Fehlermeldung in Ihrem Beispiel weist darauf hin, dass die Anmeldeshell des Remotebenutzers csh
oder ist tcsh
. 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 der csh
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 mit
ssh host csh << END
echo "$variable"
END
Dies 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 stattdessen sh
/ bash
/ ksh
verwenden.
Verwenden Sie eine Hilfsfunktion, um das sh-Zitat auszuführen:
shquote() {
awk -v q=\' -v b='\\' '
BEGIN{
for (i=1; i<ARGC; i++) {
gsub(q, q b q q, ARGV[i])
printf "%s ", q ARGV[i] q
}
print ""
exit
}' "$@"
}
Und rufen Sie an ssh
als:
ssh host sh << END
parameter=$(shquote "$parameter")
echo "\$parameter"
END
Sehen Sie, wie wir dem dritten entkommen, $
sodass die Erweiterung $parameter
von der Remote-Shell und nicht von der lokalen Shell erfolgt.