Remote-Schreiben in eine Datei mit Multi-Hop-SSH

468
CPBL

Fragen wie Fernschreiben in eine Datei mit SSH beziehen sich auf ein direktes SSH.

Aber ich erreiche das Ende eines Reverse-Tunnels, der auf dem Intermediateserver endet. Das heißt, ich ssh'ing zu einer Maschine durch eine andere. Und ich möchte in eine Datei auf der fernen Maschine schreiben. Folgendes schlägt fehl; Am Ende schreibt es auf dem Intermediateserver!

ssh -A -t intermediateserver ssh -A -t -p 666 localhost "echo 30 > tmp" 

Die Tatsache, dass es dort einen Reverse-SSH-Tunnel gibt, macht die Dinge wahrscheinlich nicht komplizierter, also sitze ich generell auf dem Homeserver und gehe durch einen Zwischenserver zum Fernbedienungsserver.

(In meinem Fall scheint der entfernte Server aufgrund seines bereits vorhandenen Rücktunnels intern an seinem Port 666 zwischenzuschalten).

0
Wenn Sie "ssh" von "intermediateserver" zu "localhost" wechseln, sind Sie immer noch auf "intermediateserver". Wo verbinden Sie sich mit einer entfernten Maschine? Sie sagen, dass der Tunnel auf "intermediateserver" endet, welche Maschine ist weiter entfernt als das Ende der Linie? Scott vor 6 Jahren 0
Ich habe zur Klarheit editiert. Meine Situation ist wahrscheinlich etwas komplexer als relevant für die Frage. CPBL vor 6 Jahren 0

1 Antwort auf die Frage

2
muru

Für jeden Hop benötigen Sie eine Notierungsschicht. Am ssh server some command foo barEnde läuft es $SHELLmit den Argumenten -c und some command foo barso:

  1. Die erste Ebene von Anführungszeichen wird von Ihrer lokalen Shell entfernt, in der Sie den Befehl ssh ausgeführt haben, und
  2. 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-aund 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 ProxyCommandoder 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 
Ich kenne nur zwei Möglichkeiten zum Zitieren von Dingen: "und". Kann ich diese alternativ für weitere Schichten wiederverwenden, dh löst sich das Zitat-Auspacken ganz am Anfang und Anfang auf? (Ich werde es trotzdem versuchen.) Ihr besserer Ansatz) CPBL vor 6 Jahren 0
Muru: Unser Verhaltenskodex sagt "Sei nett", nicht "Sei süß". Was hat Baklava damit zu tun? :-) ⁠ Scott vor 6 Jahren 0
@CPBL leider nein. '' l1 'l2' l3 'l4' 3 2 '1' 'wird von der ersten Hülle als drei Zeichenketten gesehen:' l1 'l2 l3', `l4 ',` 3 2' 1 '. Es ist zwar möglich, auch mit Backslashes bis zu drei Notierungen zu erhalten, aber dies führt zu Wahnsinn. muru vor 6 Jahren 0
@Scott erinnerte mich an etwas, das ich vor einiger Zeit auf Jeff Atwoods Blog gesehen hatte: Siehe # 14 in https://blog.codinghorror.com/new-programming-jargon/ muru vor 6 Jahren 0
Können Sie das ProxyCommand-Beispiel verwenden, wenn Sie meine Situation verwenden, in der das Ziel ein Port auf dem Intermediate ist? Ich bin immer noch fest damit beschäftigt, diese kryptischen Bits zu interpretieren CPBL vor 6 Jahren 0
@CPBL etwas wie: `ssh -o ProxyCommand = 'ssh intermediateserver nc% h% p' -p 666 localhost" echo 30> tmp "` muru vor 6 Jahren 0
@muru Das gibt mir "bash: nc: Befehl nicht gefunden". CPBL vor 6 Jahren 0