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.


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

ś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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.