Miałem dużo zabawy, szukając rozwiązania tego problemu. Wymaga narzędzia nc (netcat) na obu komputerach i SSH (SFTP nie jest potrzebne).
W tym przykładzie wywołam maszynę, która ma dane, dla której należy wykonać kopię zapasową linux-a, i maszynę, która musi otrzymać kopię zapasową linux-b.
Na linux-a, niech netcat nasłuchuje na porcie (wziąłem 2000) i przekierowuje go do pliku. To po prostu usiądzie i zaczeka, aż coś przejdzie przez ten port.
[kenny@linux-b /var/backups]$ nc -l 2000 > backup.tgz
Na linux-b otwórz tunel ssh na linux-a, ponownie użyłem portu 2000. Spowoduje to przekierowanie wszystkiego, co rzucisz na port 2000 TCP na localhost do portu TCP 2000 na Linux-a, gdzie nasłuchuje netcat.
[kenny@linux-a /var/data]$ ssh -L 2000:localhost:2000 -CfN linux-b
Teraz utwórz archiwum tar, ale wyślij dane wyjściowe na standardowe wyjście (używając -) i potokuj je do gzip w celu uzyskania kompresji. Teraz potokuj to do innego netcata, który wysyła go do hosta lokalnego w TCP na porcie 2000.
[kenny@linux-a /var/data]$ tar cf - important-data | gzip -fc | nc localhost 2000
Skończyliśmy! Na linux-b netcat nie nasłuchuje i tworzony jest nowy plik. Najlepsze jest to, że archiwum tar nigdy nie było umieszczane na twardym dysku 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
Wiem, że nie jest to dokładnie to, o co prosiłeś w pytaniu, ale jeśli masz dostępny netcat, jest to realne rozwiązanie dla twojego rodzaju problemu.
Edycja: Zapomniałem o jednej rzeczy: jeśli zastosujesz się do tych instrukcji, nadal będziesz mieć tunel SSH unoszący się na Linuksie. Dowiedz się, jaki jest identyfikator procesu i zabij go.
[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