Esta questão é essencialmente respondida em outro lugar, incluindo aqui para scp e aqui para o rsync . Como o último inclui minha resposta, mas nenhuma resposta foi aceita, vou repeti-la aqui.
Como você observou, você pode usar a opção rsync -e | --rsh , mas será um pouco mais complicado:
rsync -azv -e 'ssh -o "ProxyCommand ssh -A PROXYHOST -W %h:%p"' foo/ dest:./foo/
Ou, se a sua versão de ssh for nova o suficiente (OpenSSH > = v7.3), você poderá usar a opção -J ( ProxyJump )
rsync -azv -e 'ssh -A -J USER@PROXYHOST:PORT' foo/ dest:./foo/
Observe que estou usando -A (encaminhamento de agente), mas também deve funcionar com autenticação de senha se você não usar chaves, e, é claro, você pode substituir proxy por B e dest com C no seu exemplo.
Se por acaso você não tiver uma nova versão ssh (> = 5.3, IIRC), use a opção netcat em vez de -W para ssh :
rsync -azv -e 'ssh -o "ProxyCommand ssh -A PROXYHOST nc %h %p"' foo/ dest:./foo/
Por fim, conforme observado nos comentários, você pode colocar o ProxyCommand em seu arquivo $HOME/.ssh/config para não ter uma linha de comando tão complicada. Especificamente, adicione algo assim:
Host C
ProxyCommand ssh -A PROXYHOST -p 22 -W %h:%p
Ou usando ProxyJump para OpenSSH > = v 7.3:
Host C
ProxyJump PROXYHOST
Então você deve ser capaz de fazer apenas:
rsync -azv foo/ C:./foo/