Tato otázka je v podstatě zodpovězena jinde, včetně zde pro scp a zde pro rsync. Vzhledem k tomu, že poslední obsahuje mou odpověď, ale žádná odpověď nebyla přijata, zopakuji to zde.
Jak jste poznamenali, můžete použít rsync 's -e | --rsh možnost, ale bude to trochu složitější:
rsync -azv -e 'ssh -o "ProxyCommand ssh -A PROXYHOST -W %h:%p"' foo/ dest:./foo/
Nebo, pokud je vaše verze ssh je dostatečně nový (OpenSSH>=v7.3), můžete použít -J (ProxyJump ) možnost
rsync -azv -e 'ssh -A -J example@unixlinux.online:PORT' foo/ dest:./foo/
Všimněte si, že používám -A (přesměrování agenta), ale mělo by to fungovat i s ověřováním heslem, pokud nepoužíváte klíče, a samozřejmě můžete nahradit proxy s B a dest s C ve vašem příkladu.
Pokud náhodou nemáte dostatečně nový ssh verze (>=5.3, IIRC), můžete použít netcat místo -W možnost na ssh :
rsync -azv -e 'ssh -o "ProxyCommand ssh -A PROXYHOST nc %h %p"' foo/ dest:./foo/
Nakonec, jak již bylo uvedeno v komentářích, můžete zadat ProxyCommand do vašeho $HOME/.ssh/config soubor, takže nemusíte mít tak složitý příkazový řádek. Konkrétně přidejte něco takového:
Host C
ProxyCommand ssh -A PROXYHOST -p 22 -W %h:%p
Nebo pomocí ProxyJump pro OpenSSH>=v 7.3:
Host C
ProxyJump PROXYHOST
Pak byste měli být schopni udělat:
rsync -azv foo/ C:./foo/