2016-10-06 8 views
3

Ich schreibe das Bash-Skript, das einige der Befehle auf dem Remote-Server über SSH ausführen muss. Das Skript hat zwei Hauptteile:Wie Übergeben lokaler Variablen an SSH-Bereich in Bash-Skript?

Teil 1: Mit lokalen Variablen $ A und $ 2 B

Teil: Befehle auf dem Remote-Server ausführen wie folgt:

ssh -T [email protected] << 'EOF' ... Using local variables $A and $B ... EOF

Das Problem ist, dass die lokalen Variablen $ A und $ B nicht im Bereich der ssh-Befehle auf dem fernen Server verfügbar sind. Soweit ich verstehe, sind die Variablen $ A und $ B außerhalb und innerhalb von SSH-Bereich nicht identisch.

Also meine Frage ist, wie lokale Variablen von Bash-Skript zu SSH-Bereich übergeben? Noch ein Hinweis, der Teil 2 ist ziemlich groß, so dass ich nach ssh nicht "einen Liner" verwenden kann. lokale Variablen

Dank

+0

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) –

+0

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

+0

Was passiert, wenn Sie ein eigenes Skript mit localhost und mit Ihrem Remote-Server verwenden? –

Antwort

0

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 
+0

Ich sehe deinen Standpunkt. Danke für die Erklärung. Der Grund, warum ich EOF zitiert bin ist, dass im Inneren "hier Dokument" unter anderem ich den Code haben: ' ssh -T user @ server << 'EOF' für f in/var/log/messages *; tun echo "Dateiname:" f $ getan EOF ' Dieser Code druckt leere Strings mit unquoted EOF und funktioniert wie erwartet (druckt Dateinamen) mit EOF zitierte – Steeve007

+0

@ Steeve007: siehe meine bearbeiten ... –

0

Es könnte ein Weg sein, direkt ssh zu sagen, zu verwenden, aber ich werde schnell antworten und erwähnen, dass Sie ein Skript verwenden könnte, die den ssh mit Code wickelt, die die Variablen fügt der Ferne, wo Sie Zugriff auf sie haben, sobald Sie die Eingabeaufforderung steuern können.

Verwandte Themen