Za oknem pada, to z pasami więcej w domu niż na dworze, a więc postanowiłem wykorzystać ten dzień na przygotowanie nowego serwera VPS (więcej o tym niebawem, pewnie jakoś po weekendzie), na którym już od kilku godzin działa Webinsider. Przy tej okazji korzystałem m.in. z SSH (w tym SCP dla transferu plików) oraz narzędzia/programu Rsync. I tak sobie pomyślałem, że chyba nie pisałem jeszcze o synchronizacji plików za pomocą Rsync przez SSH – a zdecydowanie warto to nadrobić, bo jest to niezwykle przydatne i dość wygodne połączenie np. przy migracji serwera (choć nie tylko).
Spis treści w artykule
Rsync przez SSH
Załóżmy, że mamy 2 serwery (lub komputery, nie ma znaczenia – ważne, by była dostępna usługa SSH) i chcemy skopiować dane/pliki z jednego na drugi, najlepiej z zachowaniem wszystkich właściwości plików (np. uprawnień).
Oczywiście możemy zrobić lokalnie kopię na serwerze A, choćby jako archiwum tar/gzip (możemy w ten sposób zachować właściwości plików), które następnie skopiujemy np. za pomocą WinSCP na serwer B, i tam je rozpakujemy – sam często korzystam z tej metody, choć sprawdza się ona głównie dla mniejszych ilości danych.
W sytuacji, gdy danych jest więcej (ilość lub objętość) zazwyczaj szybciej/sprawniej wyjdzie skopiować je po SSH za pomocą programu Rsync.
Z racji tego, że polecenie wygląda inaczej zależnie od tego, czy zostanie wprowadzone na komputerze źródłowym, czy docelowym, postanowiłem rozbić to na 2 oddzielne podpunkty:
Kopiowanie na zdalny serwer/komputer
Zaczniemy od sytuacji, gdy jesteśmy zalogowani na komputerze, z którego dane chcemy przesłać na inny (zdalny) serwer/komputer – w takim przypadku najprostsze polecenie będzie wyglądało np. tak:
rsync -avzl /katalog/lokalny/ -e ssh użytkownik@adres_zdalnego_serwera:/katalog/zdalny
np.:
rsync -avzl /var/www/ -e ssh [email protected]:/var/www
Natomiast w sytuacji, gdy usługa SSH na zdalnym urządzeniu działa na porcie innym niż domyślny (zalecam) musimy dodać jeszcze numer portu:
rsync -avzl /katalog/lokalny/ -e "ssh -p PORT" użytkownik@adres_zdalnego_serwera:/katalog/zdalny
np.:
rsync -avzl /var/www/ -e "ssh -p 2122" [email protected]:/var/www
Do uwierzytelnienia można również wykorzystać klucze RSA (certyfikat prywatny i publiczny), dzięki czemu można z synchronizacji Rsync po SSH korzystać również w rozwiązaniach automatycznych (skryptach).
W takim przypadku do polecenia musimy dodać jeszcze jeden parametr, ze wskazaniem klucza prywatnego, z którego chcemy skorzystać:
rsync -avzl -e "ssh -p PORT -i /ścieżka/do/klucza/prywatnego" /katalog/lokalny/ użytkownik@adres_zdalnego_serwera:/katalog/zdalny
np.:
rsync -avzl -e "ssh -p 2122 -i /home/patryk/.ssh/id_rsa" /var/www/ [email protected]:/var/www
Dalej wszystko przebiega już normalnie, czyli mamy pytanie o hasło (jeśli wymagane przy kluczu), czy kod jednorazowy (uwierzytelnienie dwuskładnikowe).
Kopiowanie na lokalny serwer/komputer
Gdy jesteśmy zalogowani na komputerze, na który chcemy skopiować dane z innego (zdalnego) serwera/komputera najprostsze polecenie będzie wyglądało np. tak:
rsync -avzl -e ssh użytkownik@adres_zdalnego_serwera:/katalog/zdalny/ /katalog/lokalny
np.:
rsync -avzl -e ssh [email protected]:/var/www/ /var/www
W sytuacji, gdy usługa SSH na zdalnym urządzeniu działa na innym porcie niż domyślny (zalecam) musimy dodać jeszcze numer portu:
rsync -avzl -e "ssh -p PORT" użytkownik@adres_zdalnego_serwera:/katalog/zdalny/ /katalog/lokalny
np.:
rsync -avzl -e "ssh -p 2122" [email protected]:/var/www/ /var/www
Po zestawieniu połączenia wystarczy podać hasło (+ ew. hasło jednorazowe przy logowaniu dwuskładnikowym) i w tym momencie powinien nastąpić transfer plików między urządzeniami.
Bez ręcznego podawania hasła
W przypadku kopiowania skryptem problemem może być konieczność podawania hasła do zdalnej maszyny. Można to rozwiązać na kilka sposobów. Najprościej będzie skorzystać z programu sshpass.
sudo apt install sshpass
Po instalacji wystarczy zmodyfikować polecenie:
sudo sshpass -p "hasło" rsync -avzl [...]
Jest to rozwiązanie proste, skuteczne, ale niekoniecznie najbezpieczniejsze, bo hasło zostanie zapisane w logach (ponoć spacja przed poleceniem pomaga).
- Wakacje składkowe ZUS a zawieszenie działalności gospodarczej, czyli uważaj, bo być może nie będziesz mógł skorzystać (w 2024) - 1970-01-01
- Przykładowy kalkulator wyceny usługi druku 3D, czyli nie tylko materiał się liczy - 1970-01-01
- Home Assistant 2024.10, czyli nowa karta „nagłówek” i niedziałający TTS w ramach usługi Google Cloud - 1970-01-01
Można jeszcze uruchomić rsync jako demon ;-) http://linux.die.net/man/5/rsyncd.conf
Dzięki za info, może komuś się przyda.
Mam na liście ten temat (może nie na najbliższe kilka dni, ale jest), a w tym temacie celowo pominąłem to zagadnienie, bo nie chciałem robić wpisu o samym rsyncu – świetne narzędzie, ale staram się je opisywać zawsze w jakimś kontekście (wykorzystanie do…).
Ale równie dobrze można było skorzystać z systemowego scp bez potrzeby instalacji rsync.
Pewnie, że można by wykorzystać do tej operacji samo SCP/SFTP, ale moim zdaniem – zwłaszcza przy tego typu operacjach – do tego celu zdecydowanie lepiej nadaje się rsync (lub inne narzędzie/program tego typu), niż „zwykłe kopiowanie plików” za pomocą SCP/SFTP (i pisze to, mimo, że z SCP/SFTP korzystam często, bo jest to dla mnie bezpieczniejsza forma FTP, a do tego nie muszę instalować i konfigurować kolejnej usługi – SSH i tak jest na serwerze).
I dla mnie (i chyba nie tylko) rsync jest równie systemowy co SSH/SCP, i nie bardzo nawet wyobrażam sobie bym nie miał go na serwerze :-)
Gdzie znajdę instalkę do Rsync’a? Rozumiem, że to działa jako usługa w Windowsie tak?
Zainteresowałem się tym tematem, ponieważ chcę zsynchronizować pliki z mojego lokalnego repozytorium GIT, a moim zdalnym serwerem. Czy miał Pan styczność z czymś takim?
Rsync to ogólnie program, który działa jako polecenie – od Ciebie zależy jak go wykorzystasz (polecenia wpisywane ręcznie, skrypty, harmonogram zadań, itp.). Dla systemów Windows jest kilka rozwiązań pozwalających korzystać z tego programu/narzędzia, np. cwRsync, i jeśli dobrze kojarzę, to działa (też) jako usługa.
W przypadku systemu Windows 10 możesz też skorzystać z „wbudowane Linuxa”, czyli „Linux Bash Shell”, gdzie również możemy korzystać z tego programu/polecenia (tak jak w przypadku normalnego Debiana czy Ubuntu).
Co do synchronizacji plików między Windowsem a serwerami na Linuxie, to korzystam z różnych rozwiązań, jest w śród nich również rsync, ale zazwyczaj to serwery Linuksowe odpowiadają za synchronizację, komputery z Windowsem udostępniają tylko zasoby dyskowe (ale można odwrotnie).