Мне было очень весело найти решение этой проблемы. Для этого требуется инструмент nc (netcat) на обеих машинах и SSH (SFTP не требуется).
В этом примере я буду называть машину, на которой есть данные для резервного копирования, linux-a, и машину, которая должна получить резервную копию linux-b.
На linux-a netcat прослушивает порт (я взял 2000) и перенаправляю его в файл. Это будет просто сидеть и ждать, пока что-то не пройдет через этот порт.
[kenny@linux-b /var/backups]$ nc -l 2000 > backup.tgz
На linux-b, откройте ssh-туннель к linux-a, я снова использовал порт 2000. Это перенаправит все, что вы выбросите на TCP-порт 2000 на локальном хосте, на TCP-порт 2000 на linux-a, где прослушивает netcat.
[kenny@linux-a /var/data]$ ssh -L 2000:localhost:2000 -CfN linux-b
Теперь создайте архив tar, но отправьте вывод в stdout (используя -) и передайте его в gzip для некоторого сжатия. Теперь передайте это другому netcat, который отправит его на локальный хост по TCP через порт 2000.
[kenny@linux-a /var/data]$ tar cf - important-data | gzip -fc | nc localhost 2000
Были сделаны! На linux-b netcat больше не слушает, и создается новый файл. Самое приятное то, что архив tar никогда не помещался на жесткий диск linux-a.
[kenny@linux-b /var/backups]$ file backup.tgz
backup.tgz: gzip compressed data, from Unix, last modified: Thu Jul 5 13:48:03 2012
Я знаю, что это не совсем то, что вы просили в вопросе, но если у вас есть netcat, это жизнеспособное решение для вашего типа проблемы.
Редактировать: я забыл одну вещь: если вы будете следовать этим инструкциям, у вас все еще будет SSH-туннель, плавающий на linux-a. Узнайте, что такое идентификатор процесса, и убейте его.
[kenny@linux-a /var/data]$ ps -ef | grep "ssh -L"
kenny 5741 1 0 13:40 ? 00:00:00 ssh -L 2000:localhost:2000 -CfN linux-b
kenny 5940 3360 0 14:13 pts/1 00:00:00 grep --color=auto ssh -L
[kenny@linux-a /var/data]$ kill 5741