Chciałbym przesyłać pliki między dwoma zdalnymi hostami za pomocą lokalnej powłoki, ale wygląda na to, że rsync nie obsługuje synchronizacji, jeśli dwa piloty są określone w następujący sposób:
$ rsync -vuar host1:/var/www host2:/var/www
The source and destination cannot both be remote.
Jakie inne obejścia / polecenia mogę użyć, aby osiągnąć podobne wyniki?
sshfs
jest to, że następniersync
widzi źródłowy i docelowy system plików zarówno jako lokalny, więc wyłącza swój algorytm delta. W tym momencie równie dobrze możesz po prostu użyćcp -p
. Zobacz odpowiedź, która proponuje to i jego dalsze komentarze.Odpowiedzi:
Jak odkryłeś, nie możesz używać rsync ze zdalnym źródłem i zdalnym miejscem docelowym. Zakładając, że dwa serwery nie mogą rozmawiać bezpośrednio ze sobą, możliwe jest użycie ssh do tunelowania za pośrednictwem komputera lokalnego.
Zamiast
możesz tego użyć
Jeśli się zastanawiasz,
-R
opcja konfiguruje kanał zwrotny z portu 50000 na hoście 1, który mapuje (za pośrednictwem komputera lokalnego) na port 22 na hoście 2. Nie ma bezpośredniego połączenia z hosta 1 do hosta 2.źródło
sshfs
montować oba zdalne katalogi lokalnie, a następnie korzystałemrsync
z dwóch lokalnie montowanych katalogów.-i
klawiszy do określania potrzebnych poleceń ssh.-i key...
parametr w cudzysłowie possh
poleceniu. Jeśli to nie pomoże, możesz zadać nowe pytanie, odnosząc się do tej odpowiedzi w kontekściescp -3
.Nie powiedziałeś, dlaczego nie chcesz zalogować się na jednym hoście, a następnie skopiować na inny, więc podzielę się jednym z moich powodów i rozwiązań.
Nie mogłem zalogować się na jednej maszynie, a następnie rsync na drugiej, ponieważ żaden host nie miał klucza SSH, który mógłby zalogować się na drugim. Rozwiązałem to za pomocą przekazywania agenta SSH, aby umożliwić pierwszemu hostowi korzystanie z mojego klucza SSH podczas mojego logowania.
OSTRZEŻENIE: Przekazywanie SSH umożliwia hostowi używanie klucza SSH przez czas logowania. Chociaż nie mogą skopiować Twojego klucza, mogą zalogować się na innych komputerach. Upewnij się, że rozumiesz ryzyko i nie korzystaj z przekazywania agentów w przypadku maszyn, którym nie ufasz.
Następujące polecenie użyje przekierowania agenta SSH do otwarcia bezpośredniego połączenia z
host1
dohost2
. Ma to tę zaletę, że maszyna z uruchomionym poleceniem nie wączy gardła transferu.źródło
-D
zamiast-A
ominąć sieć zamiast kluczowych ograniczeń); za wyjaśnienie korzyści; za krótkie polecenie; i to faktycznie działa. Pamiętaj, że może być konieczne określenie,username@host1
czy różni się ona od lokalnej nazwy użytkownika. Ponadto rsync wykonuje weryfikację klucza hosta podczas łączenia się z hostem2, więc klucz hosta1 powinien już znajdować się w ~ / .ssh / known_hosts na hoście 2, inaczej polecenie się nie powiedzie.ssh -A
, zobacz zbieżność. jetbrains.com/display/TCD10/SSH+Agent ).Podoba mi się odpowiedź roaima, ale ścieżki są takie same w obu przykładach, zaciemniając, która jest która. Ustaliliśmy, że następujące elementy nie działają:
Ale tak się dzieje (pominąłem jawny adres bind_hosta localhost w
-R
opcji, ponieważ jest to ustawienie domyślne):Pamiętaj, że musisz mieć poprawnie skonfigurowane klucze ssh między dwoma zdalnymi hostami, z kluczem prywatnym na hoście 1 i kluczem publicznym na hoście 2.
Aby debugować połączenie, podziel to na dwie części i dodaj pełny status:
Jeśli to zadziała, będziesz mieć powłokę na hoście1. Teraz wypróbuj polecenie rsync z hosta1. Zalecam robienie tego w innym oknie, aby pełne informacje ssh nie były mieszane z informacjami o statusie rsync:
źródło
rsync
Inicjowane jest host1 z celem w host2. (Mogłeś poprosić o wyjaśnienie w komentarzu.)Reformatowanie odpowiedzi przez roaima w składni skryptu bash (i dla zachowania przejrzystości dodając znaki kontynuacji linii „\”) Losowo wybrałem port 22000 ...
źródło
Idealnym sposobem byłoby uruchomienie
rsync
na jednym z tych serwerów. Ale jeśli nie chcesz uruchamiać skryptu na zdalnym serwerze. Możesz uruchomić skrypt w systemie lokalnym, wykonać ssh i wykonać tam rsync.ssh user@$host1 <<ENDSSH >> /tmp/rsync.out 2>&1 rsync -vuar /var/www host2:/var/www ENDSSH
Ponadto, jak być może wiesz, rysnc wykonuje synchronizację w jedną stronę. Jeśli chcesz synchronizacji dwukierunkowej, możesz spojrzeć na osync ( https://github.com/deajan/osync ). Używam go i uważam, że jest to pomocne.
źródło
Jako dodatkowe informacje:
Jeśli używasz hosta skoku do połączenia dwóch pozostałych maszyn, ale nie mogą one bezpośrednio do siebie dotrzeć, możesz użyć sshfs jako medium między tymi dwoma maszynami tak (na hoście skoku):
SSHFS zapewnia dwie ścieżki na hoście skoku, a rsync zarządza synchronizacją plików jak zawsze (z tą różnicą, że odbywa się to praktycznie lokalnie).
źródło
Możesz uruchomić rsyncd (serwer) na jednym z komputerów.
Podejmuję takie podejście, ponieważ nie chcę używać ssh, aby zezwolić „źródłowemu” (w brzmieniu rsync) dostępowi do „miejsca docelowego” jako root bez hasła (jak jest to wymagane do korzystania z tunelowania SSH z rsync w skrypt)
W moim przypadku po prostu skonfigurowałem serwer rsyncd na komputerze docelowym z jednym użytkownikiem dozwolonym ze źródłowego komputera i korzystałem z rsync od strony źródłowej.
Działa świetnie.
źródło
Spróbuj użyć tego. Mi to pasuje.
źródło
Łatwy w użyciu skrypt
Przez lata robiłem to wiele razy z mniej więcej tymi samymi sztuczkami, jak w każdej innej odpowiedzi tutaj. Ponieważ jednak bardzo łatwo jest pomylić niektóre szczegóły i poświęcić dużo czasu na rozwiązywanie problemu, wymyśliłem poniższy skrypt:
ssh -A
nie można propagować danych uwierzytelniających (nie wiem, dlaczego tak się dzieje czasami, ponieważ obejście było łatwiejsze niż znalezienie głównej przyczyny)Jak korzystać ze skryptu
Jak to działa
Jak powiedziałem, używa tych samych sztuczek, co w każdej innej odpowiedzi tutaj:
-R
opcja ssh z localhost do host1 podczas gdy w tym samym czasie konfigurowania przekierowania portów, które następnie pozwala host1 łączyć się za pośrednictwem localhost do host2 (-R localhost:$FREE_PORT:$TARGET_ADDR_PORT
)-A
Opcja ssh umożliwiająca łatwą autoryzację drugiego kanału sshMoje to jest skomplikowane! Czy jest jakiś łatwiejszy sposób?
Podczas kopiowania wszystkich lub większości bajtów ze źródła do miejsca docelowego jest OSTATNIE łatwiejsze w użyciu
tar
:Scenariusz
źródło
tar
jest świetny, gdy masz pojedynczy (nie przyrostowy) transfer, a transfer kończy się w jednym przejściu. Z drugiej strony,rsync
z uchwytami do przekazywania, restartuje się i przelewy przyrostowe.Można użyć
tar
za pomocąssh
do przesłania plików:Zmień
j
parametr (fortar
) naz
w dwóch miejscach, jeśli chcesz skompresować archiwumgzip
zamiastbzip2
. Zwyklebzip2
ma wyższą kompresję niżgzip
, ale jest wolniejsza, więc zmieniaj ją w zależności od potrzeb (patrz: bzip2 vs gzip ).Powiązane: Jak kopiować między dwoma zdalnymi hostami za pomocą tar przesyłanych strumieniowo do SSH ze zdalnego serwera, gdy znajduje się za zaporą?
Alternatywnie (aby zabezpieczyć przepustowość, ze względu na przezroczystą kompresję) można użyć
sshfs
do zamontowania zdalnego systemu plików jako lokalnego i używaćrsync
jak zwykle, np.źródło