scp między dwoma serwerami spoza tej samej sieci

13

Istnieją dwa serwery, do których mogę uzyskać dostęp za pomocą 2 różnych połączeń VPN. Udało mi się mieć obie VPN działające w tym samym czasie na moim komputerze (trochę zasad routingu).

Chcę zrobić scp <remote1>:some/file <remote2>:destination/folderz mojego terminala laptopa. Ale gdy spróbuję, scppolecenie wywołane na zdalnym 1 nie może znaleźć zdalnego 2, ponieważ nie znajdują się w tej samej sieci. Czy można zmusić komendę do przejścia przez mój laptop jako router?scp

Jeśli spróbuję z Nautilus (połącz się z serwerem, obydwoma serwerami, a następnie kopiuj-wklej) to działa, ale chciałbym to zrobić z terminala.

Danduk82
źródło
To twoja maszyna łączy się zarówno zdalnie 1 , jak i zdalnie 2 . Czy na pewno jest to, że błąd remote1 nie ma dostępu remote2 ?
Jan
Tak, błąd to ssh: Nie można rozpoznać nazwy hosta <remote2>:
Nieznana
A jeśli spróbuję użyć adresu IP bezpośrednio dla <remote2> połączenie po pewnym czasie nie powiedzie się (hangout).
Danduk82,
To chyba twoja maszyna nie może połączyć się ze zdalnym 2 . Może czas połączenia VPN lub będzie nierówne ...
Jan
Nie, to działa, nawet DNS działa. Naprawdę mam wrażenie, że próbuje polecenia scp do wykonania połączenia między remote1 i remote2 bezpośrednio na remote1 .
Danduk82,

Odpowiedzi:

34

Nowsze wersje scp mają opcję -3

-3

Copies between two remote hosts are transferred through the local host. Without this option the data is copied directly between the two remote hosts
Andy
źródło
świetny! Dokładnie to, czego potrzebowałem.
Wielkie
1
Świetne znalezisko, nie wiedziałem o tym!
Jan
9

Jeśli potrzebujesz większej elastyczności niż scp -3zwykłe, sshfajki są fajne.

Jest to równoważne przekierowaniu strumienia na maszynie lokalnej:

ssh sourceRemote 'cat /path/to/sourceFile' \
| ssh destinationRemote 'cat > /path/to/destinationFile'

Następnie możesz dodać więcej przekierowań strumienia w dowolnym momencie, np. Połączyć kilka komputerów pośrednich lub zapisać lokalną kopię przesyłanego pliku podczas jego trasowania.

Anko
źródło
2
Otrzymasz ładny pasek postępu, jeśli maszyna źródłowa została pvzainstalowana i zastąpisz nią pierwszą cat.
liori
6

Rozwijając odpowiedź @ Anko, możesz użyć tardla wielu plików:

ssh -q user@sourcehost 'cd /source/path; tar -czf - files...' | \
ssh -q user@desthost 'cd /dest/path; tar -xzf -'

Kompresja jest całkowicie opcjonalna - dane mogą nie być zbyt kompresowalne lub wystarczająco duże, aby uzasadnić narzut. Jeśli twoja wersja tarnie obsługuje -zprzełącznika, przepuść odpowiednio gzip -ci gzip -dc.

PS: Strzeż się wersji tar, które nie usuwają wiodących ukośników podczas ekstrakcji (tzn. Zapisuj bezwzględne ścieżki, jeśli są dostarczone).

Edycja: -e nonenie jest potrzebne w potokach, ponieważ pseudo-terminal nie jest przydzielony.

arielCo
źródło
1
sshma -Cflagę umożliwiającą kompresję strumienia. Zgodnie ze manstroną, używa tego samego algorytmu, jak gzipgdyby. Strona podręcznika wyjaśnia również, kiedy należy z niej korzystać: „Kompresja jest pożądana w liniach modemowych i innych wolnych połączeniach, ale spowalnia tylko szybkie sieci”.
Anko
4
@Anko, problem z używaniem -Ctutaj polega na tym, że lokalny komputer musiałby rozpakować i ponownie skompresować dane. Polecenie tarwykonania kompresji oznacza, że ​​skompresowane dane są przesyłane prosto przez rurę bez żadnego przetwarzania.
cjm