Die Liste der akzeptierten Umgebungsvariablen auf SSHD enthält standardmäßig LC_*
. Also:
LC_MY_BUILDN="1.2.3" ssh -o "SendEnv LC_MY_BUILDN" ssh-host 'echo $LC_MY_BUILDN'
1.2.3
Variablen in einfachen Anführungszeichen werden nicht ausgewertet. Verwenden Sie doppelte Anführungszeichen:
ssh [email protected] "~/tools/run_pvt.pl $BUILD_NUMBER"
Die Shell erweitert Variablen in doppelten Anführungszeichen, aber nicht in einfachen Anführungszeichen. Diese ändert sich in Ihre gewünschte Zeichenfolge, bevor sie an ssh
übergeben wird Befehl.
Wenn Sie
verwendenssh [email protected] "~/tools/run_pvt.pl $BUILD_NUMBER"
statt
ssh [email protected] '~/tools/run_pvt.pl $BUILD_NUMBER'
Ihre Shell interpoliert die $BUILD_NUMBER
bevor die Befehlszeichenfolge an den Remote-Host gesendet wird.
(Diese Antwort mag unnötig kompliziert erscheinen, aber sie ist leicht erweiterbar und robust in Bezug auf Leerzeichen und Sonderzeichen, soweit ich weiß.)
Sie können Daten direkt über die Standardeingabe des ssh
eingeben Befehl und read
das vom entfernten Standort.
Im folgenden Beispiel
- Ein indiziertes Array wird (der Einfachheit halber) mit den Namen der Variablen gefüllt, deren Werte Sie auf der entfernten Seite abrufen möchten.
- Für jede dieser Variablen geben wir
ssh
an eine mit Null abgeschlossene Zeile, die den Namen und Wert der Variablen angibt. - Im
shh
Befehl selbst durchlaufen wir diese Zeilen, um die erforderlichen Variablen zu initialisieren.
# Initialize examples of variables.
# The first one even contains whitespace and a newline.
readonly FOO=$'apjlljs ailsi \n ajlls\t éjij'
readonly BAR=ygnàgyààynygbjrbjrb
# Make a list of what you want to pass through SSH.
# (The “unset” is just in case someone exported
# an associative array with this name.)
unset -v VAR_NAMES
readonly VAR_NAMES=(
FOO
BAR
)
for name in "${VAR_NAMES[@]}"
do
printf '%s %s\0' "$name" "${!name}"
done | ssh [email protected] '
while read -rd '"''"' name value
do
export "$name"="$value"
done
# Check
printf "FOO = [%q]; BAR = [%q]\n" "$FOO" "$BAR"
'
Ausgabe:
FOO = [$'apjlljs ailsi \n ajlls\t éjij']; BAR = [ygnàgyààynygbjrbjrb]
Wenn Sie export
nicht benötigen diese sollten Sie in der Lage sein, declare
zu verwenden statt export
.
Eine wirklich vereinfachte Version (wenn Sie die Erweiterbarkeit nicht benötigen, eine einzelne Variable zu verarbeiten haben usw.) würde so aussehen:
$ ssh [email protected] 'read foo' <<< "$foo"