Ich weiß leider keine bessere Lösung als die, die ich in so einem Fall immer verwende und die sieht wie folgt aus.
Voraussetzung ist, dass man auf dem Zwischen-Host (in dem Fall B) die Möglichkeit hat einen Tunnel zu erstellen und auf den jeweiligen Port von Außerhalb zugegriffen werden kann. Wenn das möglich ist, dann kann man so vorgehen:
In einem Terminal per SSH auf Host B verbinden. Dann dort mit
ssh -N -L *:1337:localhost:22 user@C
einen SSH-Tunnel erstellen, welche sich auf B:1337 klemmt und alles, was an diesen Port geht, an C:22 weiterleitet. Jetzt kann man auf A sich direkt über diesen Tunnel mit C verbinden, also mit
ssh -p 1337 Cuser@B
Der Aufruf von rsync sieht demnach so aus:
rsync -avc -e "ssh -p 1337 Cuser@B" src dest
Über eine optimalere Lösung würde ich mich ehrlich gesagt auch freuen, denn diese Variante ist bei ein oder zwei Hops noch gut machbar, drei sind aber dann schon echt die äußerste Grenze, über mehr Hops wirds dann schon echt mühselig. Gut, so viele Hops sind dann vielleicht eher hypothetischer Natur, dennoch ist es selbst bei einem Hop nicht besonders elegant. Das Hauptproblem dabei ist aber vor allem, dass der jeweilige Tunnel-Port erreichbar sein muss, was bei einer halbwegs vernünftig eingerichteteten Firewall eher nicht der Fall sein dürfte. Genau genommen ist das auch nicht unbedingt ein Problem, denn man kann das auch umgehen, indem man auf A mit
ssh -N -L localhost:1337:localhost:1337 Buser@B
einen entsprechenden Tunnel erstellt und dann alles über
ssh -p 1337 Cuser@localhost
abfertig, aber das macht die ganze Sache auch nicht gerade übersichtlicher und jetzt sind wir bei bereits min. 3 Terminal-Fenstern (eins für Tunnel B -> C, eins für Tunnel A -> B -> C und eins für was auch immer man macht) und das für einen Hop.
Wenn jemand eine bessere Lösung kennt oder findet, immer her damit, ich würd mich ebenfalls drüber freuen 🙂