Ich versuche, mit dem folgenden Code eine Umgebungsvariable an einen Remote-Host zu übergeben.
ssh username@ip "env current_quarter=$current_quarter" sh -s << 'EOF'
pwd
echo "${current_quarter}"
EOF
pwd
druckt den richtigen Standort auf dem Remote-Host, aber echo "${current_quarter}"
nicht das aktuelle Quartal.
Antwort1
Durch das Einfügen EOF
von Anführungszeichen weisen Sie die lokale Shell an, das Here-Dokument nicht zu expandieren, bevor es an ssh übergeben wird. Laut derBash-Dokumentationdies gilt für Parametererweiterung, Befehlsersetzung und arithmetische Erweiterung.
Im Gegensatz zu dem, was ich beim ursprünglichen Schreiben dieser Antwort dachte, ist die Remote-Shell hiervon nicht betroffen und führt das Dokument hier so aus, wie Sie es direkt in der Remote-Shell geschrieben haben (einschließlich aller Arten von Erweiterungen und Ersetzungen, die in der lokalen Shell durch Anführungszeichen übersprungen wurden EOF
).
Wenn Sie nur die lokale Variable verwenden möchten, test
entfernen Sie die Anführungszeichen aus dem EOF:
ssh user@host sh -s <<EOF
pwd
echo $test
EOF
Für Fischbenutzer würde es folgendermaßen aussehen:
ssh user@host "\
pwd
echo $test
"
test
Wenn Sie nun die lokale Variable als Remote-Variable übergeben remote_test
und nicht lokal erweitern möchten, maskieren Sie die Variable einfach mit einem Backslash:
ssh user@host sh -s <<EOF
export remote_test=$test
pwd
echo "\${remote_test}"
EOF
Bearbeiten:
Läuft:
ssh user@host "env remote_test=$test" sh -s <<'EOF'
pwd
echo "${remote_test}"
EOF
sollte dem dritten Codebeispiel entsprechen, mit der Ausnahme, dass es env
nicht Teil der Shell ist und auch in Nicht-Bourne-Shells verwendet werden kann.
(Dies ist jedoch identisch mit dem Codebeispiel, das OP angegeben hat. Da OP diese Antwort jedoch als richtig markiert hat, vermute ich, dass sich „env“ und „export“ bei bestimmten Zeichenfolgen unterschiedlich verhalten. Ich habe jedoch keine schlüssigen Beweise für diese Hypothese gefunden.)