Przesyłaj pliki między dwoma zdalnymi serwerami SSH

21

Czy istnieje prosty sposób przesyłania plików między dwoma serwerami SSH / SFTP? Idealnym rozwiązaniem byłaby FileZilla, ale pozwala tylko utworzyć połączenie między lokalnym a zdalnym, ale nie między zdalnym a zdalnym.

Teoretycznie mógłbym otworzyć dwa okna Nautilus i podłączyć do niektórych ssh://server1/path/to/folderi ssh://server2/path/to/folder, a następnie po prostu wyciągnąć pliki z jednego do drugiego boku. Z mojego doświadczenia wynika, że ​​jest to bardzo niestabilne. Przesyłanie plików w sumie wielkości np. 10 MB nie stanowi problemu, ale przesłanie np. 10 GB często powodowało, że Nautilus się rozłączał i pozostawał tam w potrzebie ps -e | grep nautilus-> kill -9 <pid>. Testowałem to samo z Nemo i Cają. Podczas gdy Nemo jest bardziej stabilny niż dwa pozostałe, wciąż nie jest doskonały i od czasu do czasu pęka. FileZilla jest wyjątkowo stabilny, tak naprawdę nigdy go nie złamał, ale nie jest zbyt elastyczny ze względu na wspomniany fakt, że może łączyć się tylko z jednym serwerem SSH.

Oczywiście mógłbym również zamontować folder sshfs, ale jest to trochę niewygodne rozwiązanie. Zbyt wiele pracy wstępnej do wykonania, aby uruchomić prosty transfer.

Czy jest jakaś aplikacja, która może obsłużyć transfery między dwoma serwerami SSH bez zerwania? Idealne byłoby coś takiego jak FileZilla, który ponownie odbierze zadanie, jeśli połączenie zostanie przerwane.

Sokrates
źródło
Nie odpowiedź, ponieważ nie jest to strona z zaleceniami dotyczącymi oprogramowania, ale od lat korzystam z (komercyjnego) Beyond Compare ( scootersoftware.com ) i jest to po prostu świetne rozwiązanie do tego rodzaju zadań. Oferuje dwa okna, z których oba mogą pokazywać ścieżkę lokalną lub adres URL sftp: //, pokazują różnice między folderami, a jego zdolność do kopiowania tylko różnic stanowi doskonały mechanizm wznawiania, jeśli się zepsuje, co zdarza się bardzo rzadko z mojego doświadczenia. (Nie związany z nimi, z wyjątkiem bycia zadowolonym klientem).
Guntram Blohm obsługuje Monikę

Odpowiedzi:

36

Jeśli jesteś w wersji Ubuntu, która jest nadal obsługiwana, wówczas scpkomenda zapewni -3przełącznik, który umożliwia kopiowanie plików z remote1 do remote2 poprzez localhost :

me@local:~> scp -3 user1@remote1:/path/to/file1 user2@remote2:/path/to/file2

Można również pominąć -3przełącznik, ale wtedy trzeba będzie klucza publicznego ( id_rsa.pubI) user1@remote1w pliku authorized_keysz user2@remote2:

me@local:~> scp user1@remote1:/path/to/file1 user2@remote2:/path/to/file2

scppotem pod maską robi ssh user1@remote1pierwszy i stamtąd scp /path/to/file1 user2@remote2:/path/to/file2. Dlatego poświadczenie musi być dystrybuowane inaczej niż -3rozwiązanie.

Innymi słowy:

  • scp -3 remote1:file1 remote2:file2przenosi plik z remote1 do localhost a następnie z powrotem do remote2 . Dane przesyłane są zdalnie1 → host lokalny → zdalny2 . Localhost jest 3rd party w tym scenariuszu stąd -3. Aby to zadziałało, potrzebne będą poświadczenia z hosta lokalnego zarówno na zdalnym1, jak i na zdalnym2, ponieważ localhost łączy się z nimi oboma.

  • scp remote1:file1 remote2:file2kopie pliku bezpośrednio z remote1 do remote2 w Prędkość, z jaką są połączone ze sobą. localhost nie jest tutaj zaangażowany (poza wydaniem polecenia). Dane przesyłane są zdalnie1 → zdalnie2 . Aby to zadziałało, będziesz potrzebować poświadczeń z hosta lokalnego tylko na zdalnym1, ale dodatkowo potrzebujesz poświadczeń zdalnego1 na zdalnym2, ponieważ localhost łączy się tylko ze zdalnym1, a następnie zdalny1 łączy się ze zdalnym2 .

Jeśli to możliwe, wybrałbym drugie podejście. Ponieważ niektóre komentarze już powiedzieć: zazwyczaj często kabel sieciowy między remote1 i remote2 jest znacznie grubsza niż kabla między nimi a localhost .

PerlDuck
źródło
2
To po prostu piękne. ssh to szwajcarski scyzoryk oprogramowania. Dzięki, nauczyłem się czegoś.
Marmur Organiczny
4
Zauważ, że to podejście, podobnie jak podejście nautilus opisane w pytaniu, przeniesie plik najpierw na maszynę lokalną, a następnie na drugi serwer. Spowoduje to znaczne spowolnienie, gdy dwa zdalne serwery będą miały szybsze połączenie między nimi niż komputer lokalny. (Na przykład, gdy zdalne serwery znajdują się w centrach danych, a komputer lokalny ma połączenie DSL.)
Stobor
1
@Stobor Dobra uwaga, dziękuję. Zaktualizowałem swoją odpowiedź, aby nieco wyjaśnić, w jaki sposób dane przesyłane są zi bez -3.
PerlDuck
1
Czy druga metoda działałaby z przekazywaniem agentów bez klucza lub hasła na zdalnym1?
Eric Duminil
1
@EricDuminil Obawiam się, że nie mogę powiedzieć. Nie mam żadnego doświadczenia w spedycji agentów. Ale wątpię w to, ponieważ remote1 ma odmawiać dostępu, gdy nie podano klucza ani hasła, prawda?
PerlDuck
10

W większości przypadków dwa serwery ssh mogą się nawzajem połączyć (lub przynajmniej jeden może dotrzeć do drugiego), a ponownie w większości przypadków Internet stacji roboczej jest znacznie gorszy niż którykolwiek z serwerów.

Jeśli tak, to najlepiej jest zamówić jeden serwer do przeniesienia na inny.

ssh server1 nohup scp somefile server2:somefile

Sprawdź nohup.outna serwerze 1 pod kątem błędów.

Jeśli osiągalność serwera jest odwrotna, możesz odwrócić, która maszyna jest nadrzędna:

ssh server2 nohup scp server1:somefile somefile
Jozuego
źródło
7

Być może możesz użyć jednego z kilku interfejsów GUI do rsync:

Czy jest jakaś aplikacja GUI dla polecenia rsync?

A może możesz użyć rsync bezpośrednio z wiersza poleceń, aby połączyć się z dwoma zdalnymi serwerami:

„Jak synchronizować pliki między dwoma pilotami”

Często loguję się na jednym serwerze za pomocą ssh, a następnie z wiersza poleceń tego serwera używam rsync do wypychania lub pobierania plików na drugi serwer zdalny - jest to na ogół znacznie szybsze niż próba przesłania plików przez jakiś trzeci komputer.

Rsync jest wystarczająco inteligentny, aby wykonać jakąś pracę, a jeśli coś pójdzie nie tak i zakłóci proces, może później wznowić od miejsca, w którym zostało przerwane.

David Cary
źródło
0

Musisz użyć protokołu SCP. scp file you want to transfer login@address_of_second_server:/path_where_you_want_to_save

Gravemind
źródło
2
OP chce skopiować pliki między dwoma komputerami zdalnymi, a nie z komputera lokalnego na komputer zdalny. Wygląda też na to, że szuka rozwiązania GUI.
user68186
@ user68186 moja odpowiedź jest prawidłowa.
Gravemind