Jak skopiować zawartość serwera w kilka minut?

W pracy nad stroną internetową bardzo często zachodzi potrzeba, aby skopiować wszystkie pliki – w szczególności gdy wprowadzamy zmiany na już działającym serwisie.

W jakim celu najczęściej kopiujemy cały serwis?

  • Chcemy utworzyć kopię roboczą, by testować na niej większe zmiany.
  • Chcemy mieć podręczną kopię zapasową.
  • Chcemy przenieść stronę na inny serwer (np. przy zmianie dostawcy hostingowego).

W dalszym ciągu bardzo częstym sposobem wymiany plików ze zdalną maszyną jest protokół FTP (niezmiennie od lat 80-tych). FTP nie ma żadnych ograniczeń jeśli chodzi o prędkość przesyłu danych i pracuje z maksymalną prędkością na jaką pozwalają łącza komunikacyjne między obiema maszynami. #wiemyjak

Kopiowanie zaczyna być problematyczne dopiero wtedy gdy przyjdzie nam skopiować dużo nawet bardzo niewielkich plików. Najwięcej czasu pochłania wówczas „rozmowa” serwera z klientem – czyli wymiana poleceń i komunikatów do obsługi transakcji.

Czasami skopiowanie serwisu jest niemożliwe, ponieważ zbudowany jest z dziesiątek tysięcy małych plików i transmisja wszystkich po kolei trwałaby niemiarodajnie długo.

Jeśli masz dostęp do powłoki tekstowej serwera

W wypadku dostępu do serwera przez powłokę tekstową (połączenie SSH) możemy bardzo szybko i sprawnie zaradzić temu problemowi.

  1. Przejdź do katalogu, w którym znajduje się strona (tzw. document root)
$ cd ścieżka/do/katalogu
  1. Spakuj wszystkie pliki do archiwum tar i umieść je o jeden katalog wyżej
$ tar -cf ../kopia-strony.tar .

Jeśli chcemy aby archiwum było skompresowane (będzie wtedy zajmowało mniej przestrzeni), możemy dodać parametr „j”, który sprawi, że docelowy plik będzie miał kompresję bzip2. Warto mieć na uwadze, że tworzenie skompresowanego archiwum dłużej trwa

$ tar -cjf ../kopia-strony.tar.bz2 .

Mając taki plik możemy w dowolny sposób przesłać go na inną maszynę.

Jeśli nie masz dostępu do powłoki tekstowej

Uwaga: ta część poradnika działa tylko gdy na serwerze wykorzystywany jest język PHP w klasycznej formie – czyli możemy wykonać plik ze skryptem wpisując jego nazwę w pasku adresu przeglądarki internetowej. Ponadto – w wypadku takiego problemu zawsze warto spróbować. Nie ma jednak gwarancji, że operacja się powiedzie. Niektóre serwery w ramach zabezpieczeń mają wyłączoną tą funkcjonalność lub program antywirusowy, który na nim jest nie pozwala na przesłanie pliku.

W tym przypadku można dokonać tego w dokładnie taki sam sposób jak powyżej, ale wykonując polecenie za pośrednictwem skryptu PHP. Nie zawsze konfiguracja w php.ini na to pozwala, co jest zrozumiałe, ponieważ gdyby wirus uzyskał dostęp do edycji plików PHP, to otrzymuje również kontrolę nad poleceniami systemowymi.

  1. Utwórz plik w głównym katalogu strony (document root) i nazwij go, np. pack.php
<?php isset($_GET['jakis-ciag-znakow']) or die();
if (TRUE)
  shell_exec('tar -cf archiwum-strony.tar .');

Objaśnijmy powyższy przykład. W pierwszej linijce sprawdzamy czy istnieje parametr zapytania GET o losowej treści. Uniemożliwi to wykonanie skryptu przez niepożądane osoby.

Druga linijka wydawać się może pozbawiona sensu. Znalazła się tam, ponieważ niektóre antywirusy, które mogą być zainstalowane na serwerach, wykrywają bezpośrednie wywołanie shell_exec jako potencjalne zagrożenie. Dodanie warunku i umieszczenie shell_exec w bloku rozwiązuje ten problem.

W trzeciej linijce ostatecznie wykonujemy polecenie, które pakuje stronę do archiwum.

  1. Zostało już tylko wywołanie skryptu. W przeglądarce internetowej wpisujemy adres: http://domena.com/pack.php?losowy-ciag-znakow (ten z pierwszej linijki)Strona powinna się długo ładować – do momentu utworzenia archiwum. Jeśli serwer zgłosi błąd ‚Upłynął czas oczekiwania’ – to nic. Nie powinno to przerwać procesu tar.

UWAGA: Tak zrobiony plik jest dostępny do pobrania z dowolnego miejsca. Nie znając jego nazwy nikt go oczywiście nie pobierze, ale należy ZAWSZE PAMIĘTAĆ by usunąć go z serwera po pobraniu. Polecam też ustawienie bardziej skomplikowanej nazwy pliku.

Czasami nie chcemy przerzucać wszystkiego. Można pominąć pliki lub katalogi dodając kolejne parametry –exclude=’NAZWA_PLIKU_LUB_FOLDERU’, np.

$ tar -cjf paczka.tar.bz2 . --exclude=cache --exclude=backups

20/05/2016
Dominik Klementowski

Udostępnij:

x

ZAMÓW bezpłatną WYCENĘ

Filtr antyspamowy

Podanie imienia i nazwiska jest dobrowolne, natomiast podanie numeru telefonu i adresu e-mail jest niezbędne do obsługi zapytania. Państwa dane będą przetwarzane w celu obsługi wysłanego zapytania i tak długo, jak to konieczne do obsługi tego zapytania. Mają Państwo prawo do dostępu do swoich danych, ich sprostowania, usunięcia, ograniczenia przetwarzania, wniesienia sprzeciwu wobec przetwarzania oraz przeniesienia danych. Wysłane zapytanie obsługiwane jest przez EACTIVE wiemy jak sp. z o.o. sp. k.

* Pole wymagane

#wiemyjak

Komentarze

*

*

*

Zasady komentowania

  1. Gdy dodajesz komentarz, pamiętaj, aby:
    1. Komentarze podpisywać imieniem i/lub nazwiskiem.
    2. W polu „witryna internetowa” umieszczać link tylko do strony głównej.
  2. Wszystkie komentarze są moderowane i zastrzegamy sobie prawo do usunięcia lub edytowania wpisu/ komentarza, który:
    1. zawiera wulgaryzmy,
    2. obraża innych użytkowników,
    3. może być uznany za spam – lub ma charakter reklamowy,
    4. nie pasuje tematycznie do wpisu, nie zawiera treści merytorycznej,
    5. zawiera linki do stron, które naruszają prawo polskie.

Znajdź nas na Facebooku
Eactive - wiemy jak Lubię to