Przesyłanie Plików Pomiędzy Maszynami Linuksowymi Przez SSH
Przegląd
Czasami chcemy bezpiecznie przesyłać pliki z jednej maszyny linuksowej na drugą. Być może chcemy przesłać jakieś pliki na serwer produkcyjny lub wykonać kopię zapasową.
W tym artykule przyjrzymy się różnym narzędziom do przesyłania plików pomiędzy maszynami linuksowymi poprzez ssh, najpopularniejszy protokół zdalnego połączenia pomiędzy maszynami linuksowymi.
Przyjrzymy się dwóm najpopularniejszym narzędziom do przesyłania plików: scp i rsync.
Podstawowe zastosowanie narzędzi
2.1. Szybki przykład
Wyobraźmy sobie, że chcemy skopiować plik text.log z naszego lokalnego systemu do ścieżki /var/log na zdalnym serwerze linuksowym o adresie IP 111.111.111.111, i chcemy użyć poświadczeń użytkownika root.
Można to osiągnąć za pomocą scp lub rsync, używając tej samej podstawowej składni:
scp text.log :/var/logrsync text.log :/var/log
Zrozummy, co te polecenia mają wspólnego, zanim poznamy ich odmiany i różnice.
2.2. Ogólna składnia
Ogólna składnia scp lub rsync jest następująca:
scp/rsync ]Source_File ]Destination_file
Sekcja OPTION pozwala nam na użycie przełączników wiersza poleceń do modyfikacji zachowania operacji kopiowania. Dwie ścieżki dla źródła i miejsca docelowego pozwalają nam określić ścieżkę do pliku po obu stronach operacji kopiowania, jak również konta użytkowników, które mają być użyte.
W powyższym przykładzie, lokalny plik jest kopiowany do zdalnej lokalizacji – . Jak zobaczymy później, możemy użyć formatu remote do opisania źródła lub celu, pozwalając tym poleceniom zarówno na wysyłanie plików na serwer, jak i pobieranie plików z serwera.
2.3. Ważne rzeczy do zapamiętania
Jest kilka punktów, o których należy pamiętać, gdy przesyłamy pliki przez ssh używając dowolnego narzędzia:
- Komenda scp/rsync poprosi o hasło użytkownika do zalogowania się na zdalnym serwerze, jeśli nie mamy ustawionego auto-logowania poprzez wymianę kluczy RSA
- Nie musimy podawać naszej nazwy użytkownika lub IP serwera dla naszego lokalnego serwera
- Możemy podać ścieżkę bezwzględną lub względną do pliku źródłowego/docelowego, gdzie ścieżki względne są względne do bieżącego katalogu roboczego lub katalogu domowego zdalnego użytkownika
2.4. Określenie nazwy pliku
Podanie nazwy pliku w ścieżce docelowej nie jest obowiązkowe. Jeśli nie podamy nazwy pliku, zostanie użyta nazwa pliku źródłowego.
W naszym pierwszym przykładzie, w katalogu docelowym zostanie utworzony plik o nazwie text.log. Gdybyśmy chcieli, aby plik został zapisany pod inną nazwą, moglibyśmy podać nazwę pliku jako część ścieżki docelowej.
Używając niejawnej nazwy pliku, możemy skopiować plik ze zdalnego serwera Linux do bieżącego katalogu z jego oryginalną nazwą:
scp :/var/log/text.log .rsync :/var/log/text.log .
Tutaj parametr „.” reprezentuje bieżący katalog roboczy. Możemy również podać inną ścieżkę, jeśli chcemy:
scp :/var/log/text.log /opt/path/mytextlog.logrsync :/var/log/text.log /opt/path/mytextlog.log
2.5. Kopiowanie między serwerami
Możemy nawet użyć tych narzędzi do kopiowania między dwoma zdalnymi serwerami. Na przykład, skopiujmy plik text.log z serwera 111.111.111.111. na serwer 222.222.222.222 dla użytkownika root:
scp :/var/log/text.log :/var/logrsync :/var/log/text.log :/var/log
Gdy mamy już podstawową wiedzę na temat scp i rsync, przyjrzyjmy się im dokładniej.
scp (Secure Copy)
scp to skrót od Secure Copy i jest używany do przesyłania plików przez połączenie ssh. Jest to kopia surowa, czyli po prostu odczytuje dane z folderu źródłowego i zapisuje je w folderze docelowym. Tak więc, jeśli szukamy szybkiej kopii, która nie powinna zająć więcej niż kilka minut, powinniśmy wybrać scp.
Jeśli przesyłamy duży plik, powinniśmy upewnić się, że mamy stabilne połączenie internetowe. Ponieważ scp nie jest wznawiany, możemy stracić czas, jeśli połączenie zostanie przerwane podczas dużego transferu, a cała operacja kopiowania będzie musiała zostać ponownie uruchomiona.
3.1. Instalacja
Większość dystrybucji Linuksa posiada preinstalowany scp. Możemy łatwo sprawdzić, czy scp jest zainstalowany czy nie:
which scp
Zobaczymy ścieżkę do polecenia scp, jeśli jest już zainstalowane. Pusta odpowiedź oznacza, że scp nie jest zainstalowany.
Jeżeli jeszcze go nie mamy, to aby zainstalować scp, musimy zainstalować pakiet klienta OpenSSH z oficjalnego repozytorium pakietów:
sudo apt-get install openssh-clients # For Debian based systems like Ubuntu sudo yum install openssh-clients # For Red Hat based systems like CentOS and Fedora
Przejrzyjmy kilka typowych scenariuszy użycia scp.
3.2. Przesyłanie wielu plików
Możemy podać listę plików oddzielonych spacją, aby przesłać wiele plików:
scp text.log text1.log text2.log :/var/log
Możemy również użyć opcji -r, aby skopiować rekursywnie cały katalog. Na przykład, aby skopiować wszystkie pliki z katalogu /home/app/log/:
scp -r /home/app/log :/var/log
Możemy użyć *, aby wysłać pliki pasujące do określonego wzorca nazewnictwa. Na przykład, mamy cztery pliki text.log, text2.log, app.log i app2.log, i chcemy wysyłać tylko pliki zaczynające się od app:
scp /home/app/log/app* :/var/log
3.3. Przesyłanie plików przy użyciu plików tożsamości
Uwierzytelnianie oparte na kluczach jest preferowane w większości dystrybucji Linuksa. W poleceniu scp, możemy określić plik tożsamości używając opcji -i:
scp -i key.pem text.log :/var/log
Wielu administratorów systemu używa uwierzytelniania opartego na kluczach do transferu plików, ponieważ nie wymaga ono podawania danych uwierzytelniających użytkownika przy każdym transferze.
3.4. Kompresja w locie
Możemy zredukować czas transferu poprzez użycie kompresji w locie z opcją -C. Spowoduje to kompresję i dekompresję pliku odpowiednio na ścieżce źródłowej i docelowej:
scp -C text.log :/var/log
3.5. Ograniczenie przepustowości podczas transferu
Możemy określić przepustowość w Kbit/s za pomocą opcji -l:
scp -l 500 text.log :/var/log
3.6. Tryb verbose do debugowania
Możemy włączyć tryb verbose z opcją -v:
scp -v text.log :/var/log
Wyjście będzie wyglądało następująco:
Executing: program /usr/bin/ssh host prod-reporting-b, user jain, command scp -v -t /tmp OpenSSH_7.9p1, LibreSSL 2.7.3 debug1: Reading configuration data /etc/ssh/ssh_config debug1: /etc/ssh/ssh_config line 48: Applying options for * debug1: Connecting to prod-reporting-b port 22. debug1: Connection established. ------ Transferred: sent 2856, received 2932 bytes, in 2.1 seconds Bytes per second: sent 1366.8, received 1403.1 debug1: Exit status 0
Wyjście verbose (debug) drukuje dokładne kroki wykonywane przez scp, co jest przydatne do debugowania połączeń, uwierzytelniania i problemów z konfiguracją.
rsync (Zdalna Synchronizacja)
rsync jest szybki i wszechstronny. Jest dobry do synchronizacji i inteligentnego przesyłania plików, ponieważ śledzi ile danych zostało skopiowanych i ile jeszcze pozostało.
Powinniśmy używać rsync, gdy mamy do przesłania duże pliki – nawet jeśli wystąpią problemy z połączeniem sieciowym, dane skopiowane do tego momentu nie zostaną utracone, a gdy połączenie zostanie przywrócone, kopiowanie zostanie wznowione od tego momentu.
rsync jest szybszy od polecenia scp, gdy musimy wielokrotnie przesyłać ten sam plik, ponieważ wykorzystuje protokół remote-update, który pozwala na przesyłanie tylko różnic między dwoma zestawami plików.
4.1. Instalacja
Sprawdźmy, czy rsync jest zainstalowany, wywołując go, aby pokazać jego wersję:
rsync --version
Jeśli otrzymamy błąd, wtedy możemy go zainstalować:
sudo apt-get install rsync # For Debian based systems like Ubuntu sudo yum install rsync # For Red Hat based systems like CentOS and Fedora
Przejrzyjmy się kilku typowym scenariuszom, w których możemy użyć rsync.
4.2. Do a Dry Run
Ponieważ rsync jest tak potężny, może być niebezpiecznie używać go bez sprawdzenia co ma zamiar zrobić. Na szczęście rsync udostępnia opcję -dry-run, która wykonuje próbne uruchomienie bez faktycznego przesyłania plików:
rsync --dry-run text.log :/var/log
4.3. Kopiowanie atrybutów i metadanych
rsync udostępnia opcję -a, która kopiuje dowiązania symboliczne, czasy modyfikacji, grupy, prawa własności i uprawnienia wraz z zawartością pliku.
Inną ważną opcją jest -h, która wydrukuje dane wyjściowe w formie czytelnej dla człowieka. Może to być szczególnie pomocne, gdy działa razem z opcją -dry-run:
rsync -ah --dry-run text.log :/var/log
4.4. Przesyłanie wielu plików w katalogu
Możemy podać listę plików oddzielonych spacją, aby przesłać wiele plików:
rsync text.log text1.log text2.log :/var/log
Opcja -r rekursywnie kopiuje wszystkie pliki w katalogu:
rsync -r /home/app/log :/var/log
Operator * wysyła pliki pasujące do określonego wzorca:
rsync /home/app/log/app* :/var/log
Opcję -include i -exclude możemy wykorzystać do dołączania i wykluczania plików z listy plików wewnątrz katalogu. Na przykład, aby wysłać wszystkie pliki z katalogu z wyłączeniem tych zaczynających się od 'R':
rsync --include '*' --exclude 'R*' text.log :/urs/log
4.5. Kompresja w locie
Możemy zredukować czas transferu poprzez użycie kompresji w locie z opcją -z. Spowoduje to kompresję i dekompresję pliku odpowiednio w ścieżce źródłowej i docelowej:
rsync -z text.log :/var/log
4.6. Delete Existing Files at Destination Path Before Transfer
Opcja -delete usuwa istniejące pliki z miejsca docelowego przed transferem nowych plików:
rsync --delete text.log :/var/log
4.7. Automatically Remove Source Files After Transfer
Powiedzmy, że chcemy wykonać kopię zapasową logów z serwera produkcyjnego na serwer zapasowy. W tym scenariuszu, prawdopodobnie chcielibyśmy usunąć pliki z serwera produkcyjnego po przeniesieniu wszystkich plików na nasz serwer zapasowy.
Serwerrsync udostępnia opcję -remove-source-files do usuwania plików źródłowych po zakończeniu transferu:
rsync --remove-source-files text.log :/var/log
Które narzędzie wybrać?
Możemy użyć obu tych narzędzi do przesyłania plików pomiędzy maszynami z systemem Linux. Jednakże, powinniśmy rozważyć scp, gdy rozmiar pliku jest mały – jest to proste narzędzie do kopiowania i jest szeroko dostępne. W naszym codziennym użytkowaniu, scp jest łatwym wyborem dla małych, jednorazowych transferów.
Z rsync skorzystamy najbardziej, gdy rozmiar pliku jest duży lub gdy potrzebujemy bardziej złożonej i wydajnej synchronizacji. Jest to również lepszy wybór dla powtarzających się zadań, takich jak zadania cron i skrypty.
Podsumowanie
W tym artykule przyjrzeliśmy się dwóm narzędziom do przesyłania plików: scp i rsync.
Przyjrzeliśmy się również różnicom między nimi, oraz temu, które narzędzia pasują do określonych przypadków użycia.
W tym artykule przyjrzeliśmy się dwóm narzędziom do przesyłania plików: scp i rsync.