Readlink funktioniert nicht über SSH

469
Typhon

Ich versuche, einen Bash-Befehl über SSH zu senden ssh -q $REMOTE -x "command". Da ich mehrere Bash-Befehle habe, verwende ich << EOF.

Das Problem ist, dass der Befehl readlink eine leere Zeichenfolge zurückgibt, wenn ich das Ergebnis einer Variablen zuweise. Wenn ich es direkt anrufe, ist es nicht so.

Hier ist eine vereinfachte Version meines Codes:

ssh -q $REMOTE -x << EOF LINK="/path/to/my/link" # the link points to /path/to/my/file readlink $LINK # outputs /path/to/my/file TEST=$(readlink -f "$LINK") echo $TEST # outputs an empty string EOF 

An diesem Punkt habe ich den gleichen Code in ein Shell-Skript auf dem Remote-Computer eingefügt und versucht, das Shell-Skript aufzurufen:

# local machine ssh -q $REMOTE -x << EOF ./test-script EOF 
# remote machine "test-script" LINK="/path/to/my/link" # the link points to /path/to/my/file readlink $LINK # outputs /path/to/my/file TEST=$(readlink -f "$LINK") echo $TEST # outputs /path/to/my/file 

Plötzlich funktioniert es, wenn ich das Remote-Skript anrufe, funktioniert alles gut, aber warum funktioniert es nicht über SSH?

0
Randnotiz: [Gibt es Namenskonventionen für Variablen in Shellskripten?] (Https://unix.stackexchange.com/a/42849/108618) Kamil Maciorowski vor 5 Jahren 0

2 Antworten auf die Frage

2
Lewis M

Innerhalb dieses Dokuments werden Ihre Variablen auf der Quellenseite ausgewertet. Wenn Sie möchten, dass Ihre Variablen auf der Zielseite ausgewertet werden, deaktivieren Sie das $. Zum Beispiel,

ssh -q $REMOTE -x << EOF LINK="/path/to/my/link" readlink \$LINK TEST=\$(readlink -f "\$LINK") echo \$TEST EOF 

Hoffe das hilft

0
Kamil Maciorowski

Aus dem Bash-Referenzhandbuch :

Das Format der Here-Dokumente ist:

[n]<<[-]word here-document delimiter 

Wenn ein Teil des Wortes in Anführungszeichen gesetzt wird, ist das Trennzeichen das Ergebnis der Entfernung von Anführungszeichen für Word, und die Zeilen im Here-Dokument werden nicht erweitert. Wenn Wort unquoted ist, werden alle Linien des hier-Dokument unterworfen Expansion in den Parameter, Kommandosubstitution und arithmetische Erweiterung, die Zeichenfolge \newlineignoriert wird, und \muss verwendet werden, um die Zeichen zu zitieren \, $und `.

Also entweder Flucht $(wie diese andere Antwort sagt) oder Verwendung << "EOF"(mit Anführungszeichen); Ansonsten wird die Syntax wie $variableund $(…)lokal aufgelöst.