Für jeden Hop benötigen Sie eine Notierungsschicht. Am ssh server some command foo bar
Ende läuft es $SHELL
mit den Argumenten -c
und some command foo bar
so:
- Die erste Ebene von Anführungszeichen wird von Ihrer lokalen Shell entfernt, in der Sie den Befehl ssh ausgeführt haben, und
- Jeder nachfolgende Sprung ruft eine Shell auf, die eine andere Zitierungsebene entfernt.
Dies bedeutet wiederum, dass Shell-Vorgänge wie variable Erweiterung, Umleitung und Platzhaltererweiterung zusätzliche Anführungszeichen erfordern, um zu verhindern, dass Zwischen-Shells auf sie wirken.
Wenn ich beispielsweise die Dateien foo-a
und foo-?
in meinem Heimatverzeichnis hatte:
$ touch foo-a foo-\? $ echo foo-* foo-? foo-a $ ssh Server1 echo foo-* foo-? foo-a foo-a # foo-* expanded locally to foo-? foo-a, foo-? expanded again remotely $ ssh Server1 'echo foo-*' foo-? foo-a # foo-* expanded remotely to foo-? foo-a $ ssh Server2 ssh Server1 'echo foo-*' foo-? foo-a foo-a # foo-* expanded remotely to foo-? foo-a, foo-? expanded again remotely in the next hop $ ssh Server2 "ssh Server1 'echo foo-*'" foo-? foo-a # foo-* expanded in the last hop
Es wäre einfacher, wenn Sie ein ProxyCommand
oder verwenden ProxyHost
. Dadurch wird ein Tunnel zwischen den beiden Systemen eingerichtet, anstatt ein Baklava von Shells zu erstellen, das Befehle ausführt:
~ ssh -o ProxyCommand='ssh Server2 nc %h %p' Server1 'echo foo-*' foo-? foo-a ~ ssh -J Server2 Server1 'echo foo-*' foo-? foo-a