Das Übergeben von Variablen (Umgebungsvariablen) sshist 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 ( AcceptEnvKonfigurationsanweisung 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 bashShell-Variablen als LC_parameterUmgebungsvariable an ssh. sshsendet das an sshd, das es, wenn es akzeptiert, als Umgebungsvariable an die Anmeldeshell des Benutzers übergibt, die es dann an diesen cshBefehl weitergibt (der es dann erweitern kann).
Wie bereits erwähnt, funktioniert dies nur, wenn der Administrator des hostComputers der Konfiguration ein AcceptEnv LC_parameteroder AcceptEnv LC_*(das manchmal standardmäßig erfolgt) hinzugefügt hat sshd.
Die Undefined variableFehlermeldung in Ihrem Beispiel weist darauf hin, dass die Anmeldeshell des Remotebenutzers cshoder ist tcsh. Es ist besser, die Shell explizit aufzurufen, um Überraschungen zu vermeiden ( ssh host cshbedeutet auch, dass kein tty angefordert wird, sodass Sie es nicht benötigen -T). Beachten Sie die $LC_parameter:qSyntax, mit der cshder 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 ( bashin 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 $variableenthä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, cshwo es schwierig ist, zuverlässig zu arbeiten, und stattdessen sh/ bash/ kshverwenden.
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 sshals:
ssh host sh << END
parameter=$(shquote "$parameter")
echo "\$parameter"
END
Sehen Sie, wie wir dem dritten entkommen, $sodass die Erweiterung $parametervon der Remote-Shell und nicht von der lokalen Shell erfolgt.