Cette question trouve essentiellement une réponse ailleurs, y compris ici pour scp et ici pour rsync. Étant donné que ce dernier inclut ma réponse, mais qu'aucune réponse n'a été acceptée, je vais le répéter ici.
Comme vous l'avez noté, vous pouvez utiliser rsync est -e | --rsh option, mais ça va être un peu plus compliqué :
rsync -azv -e 'ssh -o "ProxyCommand ssh -A PROXYHOST -W %h:%p"' foo/ dest:./foo/
Ou, si votre version de ssh est assez nouveau (OpenSSH>=v7.3), vous pouvez utiliser le -J (ProxyJump ) possibilité
rsync -azv -e 'ssh -A -J example@unixlinux.online:PORT' foo/ dest:./foo/
Notez que j'utilise -A (transfert d'agent) mais cela devrait également fonctionner avec l'authentification par mot de passe si vous n'utilisez pas de clés, et, bien sûr, vous pouvez remplacer proxy avec B et dest avec C dans votre exemple.
Si par hasard vous n'avez pas un ssh assez récent version (>=5.3, IIRC), vous pouvez utiliser netcat au lieu de -W option à ssh :
rsync -azv -e 'ssh -o "ProxyCommand ssh -A PROXYHOST nc %h %p"' foo/ dest:./foo/
Enfin, comme indiqué dans les commentaires déjà, vous pouvez mettre le ProxyCommand dans votre $HOME/.ssh/config fichier afin que vous n'ayez pas à avoir une ligne de commande aussi compliquée. Plus précisément, ajoutez quelque chose comme ceci :
Host C
ProxyCommand ssh -A PROXYHOST -p 22 -W %h:%p
Ou, en utilisant ProxyJump pour OpenSSH>=v 7.3 :
Host C
ProxyJump PROXYHOST
Ensuite, vous devriez pouvoir faire :
rsync -azv foo/ C:./foo/