Esta pregunta se responde esencialmente en otro lugar, incluso aquí para scp y aquí para rsync. Dado que este último incluye mi respuesta, pero no se aceptó ninguna respuesta, lo repetiré aquí.
Como notó, puede usar rsync de -e | --rsh opción, pero va a ser un poco más complicado:
rsync -azv -e 'ssh -o "ProxyCommand ssh -A PROXYHOST -W %h:%p"' foo/ dest:./foo/
O, si su versión de ssh es lo suficientemente nuevo (OpenSSH>=v7.3), puede usar el -J (ProxyJump ) opción
rsync -azv -e 'ssh -A -J [email protected]:PORT' foo/ dest:./foo/
Tenga en cuenta que estoy usando -A (reenvío de agente) pero también debería funcionar con autenticación de contraseña si no usa claves y, por supuesto, puede reemplazar proxy con B y dest con C en tu ejemplo.
Si por casualidad no tienes un ssh lo suficientemente nuevo versión (>=5.3, IIRC), puede usar netcat en lugar de -W opción a ssh :
rsync -azv -e 'ssh -o "ProxyCommand ssh -A PROXYHOST nc %h %p"' foo/ dest:./foo/
Finalmente, como ya se señaló en los comentarios, puede poner el ProxyCommand en tu $HOME/.ssh/config archivo para que no tenga que tener una línea de comando tan complicada. Específicamente, agregue algo como esto:
Host C
ProxyCommand ssh -A PROXYHOST -p 22 -W %h:%p
O, usando ProxyJump para OpenSSH>=versión 7.3:
Host C
ProxyJump PROXYHOST
Entonces deberías poder hacer:
rsync -azv foo/ C:./foo/