Das Problem hat nichts mit ssh zu tun, sondern bezieht sich nur auf hier Dokumente in bash oder einer anderen Posix-Shell.
Man Seite für bash sagt in der hier dokumentieren Absatz:
Das Format von hier-Dokumente:
< < [-] Wort
hier-Dokument
Begrenzer
Es wird keine Parametererweiterung, Befehlsersetzung, arithmetische Erweiterung oder Pfadnamenerweiterung für das Wort ausgeführt. Wenn Zeichen in Word sind, ist das Trennzeichen das Ergebnis der Zitatentfernung bei Wort und die Zeilen im hier vorliegenden Dokument sind nicht erweitert. Wenn das Wort nicht in Anführungszeichen steht, werden alle Zeilen des Here-Dokuments einer Parametererweiterung, Befehlsersetzung und arithmetischen Erweiterung unterzogen. Im letzteren Fall wird die Zeichenfolge \<newline>
ignoriert, und \
muss verwendet werden, um die Zeichen \
, $
und ".
Wie Sie EOF
zitieren, fragen Sie ausdrücklich die Schale nicht die $1
und $2
Variablen zu ersetzen.
Der robusteste Weg ist, EOF nicht zu zitieren und alle anderen Sonderzeichen im hier vorliegenden Dokument konsequent zu zitieren.
Zum Beispiel, wenn Ihr hier Dokument enthaltenen so etwas wie:
ssh -T [email protected] << 'EOF'
for f in /var/log/messages*
do echo "Filename: " $f
done
EOF
Sie es ohne Anführungszeichen EOF umschreiben könnte aber mit einem nach innen $
:
ssh -T [email protected] << EOF
for f in /var/log/messages*
do echo "Filename: " \$f
done
EOF
Auf diese Weise alle unquoted Variablen würden interpoliert werden.
Alternativ kann, wenn der Server es erlaubt, können Sie versuchen, die zwei Parameter als Umgebungsvariablen zu übergeben. Geben Sie die Namen PARAM1
und PARAM2
ein. Die sshd_config
Datei auf dem Server sollte die Zeile AcceptEnv PARAM1 PARAM2
enthalten, da standardmäßig und aus Sicherheitsgründen keine Umgebungsvariable akzeptiert wird.
Sie können dann mit:
export PARAM1=$1
export PARAM2=$2
ssh -T -o SendEnv=PARAM1 -o SenEnv=PARAM2 [email protected] << 'EOF'
...
Using variables $PARAM1 and $PARAM2
...
EOF
ich nicht auf einer FreeBSD-Box wiedergeben kann. Die Ausgabe dieses einfachen Bash-Skript: 'echo $ 1 echo $ 2 ssh -T localhost << EOF echo foo echo $ 1 echo $ 2 Echo bar EOF' wenn genannt als ./tst.sh abc def wie erwartet: 'abc def foo abc def bar' (Zeilenumbrüche durch den Kommentar entfernt Formatierung aber definitiv keine Antwort) –
Schwer zu sagen, warum Sie dieses Problem nicht reproduzieren kann. Ich benutze Centos OS Box. Versuchen Sie, einen echten Remote-Server und keinen lokalen Host zu verwenden. – Steeve007
Was passiert, wenn Sie ein eigenes Skript mit localhost und mit Ihrem Remote-Server verwenden? –