Oto połączenie:
[Server1] <---> [my desktop] <---> [Server2]
Serwer 1 i serwer 2 nie mogą rozmawiać bezpośrednio ze sobą (nie pytaj). Mój pulpit jest jednak w stanie uzyskać dostęp do obu serwerów za pośrednictwem ssh.
Muszę skopiować pliki z serwera serwer1 na serwer serwer2.
Tradycyjnie używam hacka ssh + tar, jako takiego:
ssh -q root@Server1 'tar -vzc /path/to/files ' | ssh -q root@Server2 'tar -vzx -C /'
I to działa świetnie, ale chciałbym pójść o krok dalej i uruchomić rsync między dwoma serwerami VIA na moim pulpicie.
Teraz wiem, że mógłbym uruchomić tunel przekierowania portów ssh w jednym terminalu, a następnie rsync nad tym tunelem w innym oknie, ale nie chcę się przejmować drugim terminalem ani tworzyć i łamać osobnego tunelu przekierowania portów. czego chcę to:
- Jedno polecenie liniowej do rsynchronizacji plików z serwera Serwer1 na serwer Serwer 2 za pomocą pulpitu
- wszystko w JEDNYM wierszu poleceń, jedno okno terminala
- Chcę, aby tunel przekierowania portów istniał tylko przez całe życie komendy rsync.
- Nie chcę scp, chcę rsync.
Czy ktoś ma na to sposób?
EDYCJA: Oto działające polecenie! Świetna robota dla wszystkich: 1. Dla ścieżki klucza rsa, nie można używać tyldy, musiałem użyć „/ root /”. 2. Oto końcowy wiersz poleceń:
ssh -R 2200:SERVER2:22 root@SERVER1 "rsync -e 'ssh -p 2200 -i /root/.ssh/id_rsa_ROOT_ON_SERVER2' --stats --progress -vaz /path/to/big/files root@localhost:/destination/path"
Bum przechodzi w dynamit.
Odpowiedzi:
Jeśli z przyjemnością przechowujesz kopię danych na komputerze pośrednim, możesz po prostu napisać skrypt, który zaktualizował kopię lokalną, używając serwera server1 jako referencji, a następnie zaktualizował kopię zapasową na serwerze2, używając kopii lokalnej jako referencji:
Użycie prostego skryptu oznacza, że chcesz, aby pojedyncze polecenie wykonało wszystko. Może to być oczywiście nie-bezpieczeństwo, jeśli dane są wrażliwe (ty lub inni w twojej firmie, nie chcesz, aby kopia unosiła się na twoim laptopie). Jeśli serwer1 jest lokalny dla Ciebie, możesz po prostu usunąć lokalną kopię później (ponieważ następnym razem będzie można szybko zrekonstruować lokalną sieć LAN).
Konstrukcja tunelu, aby serwery mogły efektywniej ze sobą rozmawiać, powinna być możliwa w następujący sposób:
Na serwerze 2 utwórz skrypt, który przez kilka sekund nie wykonuje nic poza uśpieniem w pętli, a następnie wyśle echo niewielkiej ilości tekstu i użyj tej „kopii” sh:
(
echo
prawdopodobnie nie jest to konieczne, ponieważ sesja nie będzie bezczynna przez wystarczająco długi czas, aby przekroczyć limit czasu, nawet jeśli SSHd jest skonfigurowany do ignorowania pakietów utrzymywania aktywności od klienta ssh)Teraz możesz napisać skrypt na swoim laptopie, który uruchamia tunel zwrotny w tle, informuje serwer server1, aby użył rsync do wykonania operacji kopiowania, a następnie zabija tunel zwrotny, zabijając skrypt zapętlający (który zamyka sesję SSH):
Sposób, w jaki to działa:
Nie wydaje się to szczególnie czyste, ale powinno działać. Nie przetestowałem powyższego, więc może być konieczne jego ulepszenie. Uczynienie z polecenia rsync skryptu jednowierszowego na serwerze server1 może pomóc, zmniejszając potrzebę ucieczki znaków takich jak 'w wywoływanym poleceniu ssh.
BTW: mówisz „nie pytaj”, dlaczego dwa serwery nie widzą się bezpośrednio, ale często jest to dobry powód. Mój serwer domowy i serwer, na których przechowywane są jego kopie zapasowe online, nie mogą się ze sobą zalogować (i mają różne hasła + klucze dla wszystkich użytkowników) - oznacza to, że jeśli jeden z dwóch komputerów zostanie zhakowany, nie można go użyć jako łatwej drogi do zhakuj drugą, aby moje kopie zapasowe były bezpieczniejsze (ktoś złośliwie usuwający moje dane z live nie może wykorzystać swojej możliwości aktualizacji kopii zapasowych, aby usunąć te kopie zapasowe, ponieważ nie ma możliwości bezpośredniego dotknięcia głównej witryny kopii zapasowej). Oba serwery mogą się łączyć z serwerem pośrednim gdzie indziej - serwer na żywo jest ustawiony, aby wcześnie rano przesyłać kopie zapasowe (przez rsync) na maszynę pośrednią, a serwer zapasowy jest ustawiony (chwilę później, aby umożliwić wykonanie kroku pierwszego), aby się połączyć i zbieraj aktualizacje (ponownie za pomocą rsyc, a następnie migawki, aby zachować wiele lat tworzenia kopii zapasowych). Ta technika może być użyteczna również w twoich okolicznościach, a jeśli tak, poleciłbym ją jako znacznie czystszy sposób robienia rzeczy.
Edycja: Scalenie mojego hacka z Aaronem, aby uniknąć całego zamieszania z kopiami / bin / sh i oddzielnym skryptem utrzymywania aktywności na serwerze 2, ten skrypt na twoim laptopie powinien wykonać całą robotę:
Podobnie jak powyżej, rsync łączy się z localhost: 2222, który przesyła tunelem do localhost twojego laptopa: 2222, który przesyła przez drugi tunel do localhost server2: 22.
Edycja 2: Jeśli nie masz nic przeciwko serwerowi 1 posiadającemu klucz, który pozwala mu bezpośrednio uwierzytelnić się na serwerze server2 (nawet jeśli nie widzi serwera server2 bez tunelu), możesz dalej uprościć:
gdzie 123.123.123.123 to adres publiczny dla server2, który może być używany jako kopia + wklej jednowarstwowy zamiast skryptu.
źródło
ssh -R 2200:SERVER2:22 root@SERVER1 "rsync -e 'ssh -p 2200 -i /root/.ssh/id_rsa_ROOT_ON_SERVER2' --stats --progress -vaz /path/to/big/files root@localhost:/destination/path"
If you don't mind server1 having a key ...
. Czy możesz mi powiedzieć, czy naprawdę można uniknąć posiadania klucza server2 na serwerze server1?Oto kilka metod, które sprawiają, że synchronizacja jest prostą linią, ale wymaga trochę pracy instalacyjnej.
Skonfiguruj tunel zwrotny ssh z serwera serwer1 na pulpit (przepraszam, nie mogę powiedzieć
.ssh/config
inkantacji z czubka głowy). Połącz go z połączeniem z pulpitu do serwera2. Uruchom rsync z serwera server1.Skonfiguruj serwer proxy skarpet (lub serwer proxy HTTP, który akceptuje CONNECT) na pulpicie. Użyj go, aby ustanowić połączenie ssh z server1 do server2. Uruchom rsync z server2.
Użyj unison zamiast rsync. Ale przepływ pracy jest inny.
Zamontuj katalogi z jednego lub obu serwerów na pulpicie za pomocą sshfs .
źródło
Dlaczego jedna linia? Użyj małego skryptu powłoki:
IIRC, możesz ustawić niższy czas snu; pierwszy
ssh
nie zakończy się, dopóki ktoś będzie korzystał z kanału.źródło
sleep
itrap
jest starsze niż metoda „utrzymuj przy życiu i zabij” w mojej odpowiedzi .