Questa domanda trova essenzialmente risposta altrove, incluso qui per scp e qui per rsync. Poiché quest'ultima include la mia risposta, ma nessuna risposta è stata accettata, la ripeterò qui.
Come hai notato, puoi usare rsync è -e | --rsh opzione, ma sarà un po' più complicato:
rsync -azv -e 'ssh -o "ProxyCommand ssh -A PROXYHOST -W %h:%p"' foo/ dest:./foo/
Oppure, se la tua versione di ssh è abbastanza nuovo (OpenSSH>=v7.3), puoi usare -J (ProxyJump ) opzione
rsync -azv -e 'ssh -A -J [email protected]:PORT' foo/ dest:./foo/
Nota che sto usando -A (inoltro agente) ma dovrebbe funzionare anche con l'autenticazione della password se non si utilizzano le chiavi e, ovviamente, è possibile sostituire proxy con B e dest con C nel tuo esempio.
Se per caso non hai un ssh abbastanza nuovo version (>=5.3, IIRC), puoi usare netcat invece di -W opzione a ssh :
rsync -azv -e 'ssh -o "ProxyCommand ssh -A PROXYHOST nc %h %p"' foo/ dest:./foo/
Infine, come già notato nei commenti, puoi inserire ProxyCommand nel tuo $HOME/.ssh/config file in modo da non dover disporre di una riga di comando così complicata. Nello specifico, aggiungi qualcosa del genere:
Host C
ProxyCommand ssh -A PROXYHOST -p 22 -W %h:%p
Oppure, usando ProxyJump per OpenSSH>=v 7.3:
Host C
ProxyJump PROXYHOST
Quindi dovresti essere in grado di fare solo:
rsync -azv foo/ C:./foo/