2012-06-14 8 views
58

Potrzebuję ponownie zainstalować jeden z naszych serwerów, i jako środek ostrożności chcę przenieść /home, /etc, /opt i /Services do serwera kopii zapasowych.Czy SCP może ignorować dowiązania symboliczne podczas kopiowania?

Jednak mam problem: z powodu dużej liczby dowiązań symbolicznych wiele plików jest kopiowanych wiele razy.

Czy można usunąć scp zignorować dowiązania symboliczne (lub w rzeczywistości skopiować łącze jako link nie jako katalog lub plik)? Jeśli nie, czy jest inny sposób na zrobienie tego?

Odpowiedz

55

Wiedziałem, że to możliwe, po prostu wziąłem złe narzędzie. Zrobiłem to z rsync

rsync --progress -avhe ssh /usr/local/ XXX.XXX.XXX.XXX:/BackUp/usr/local/ 
+0

Co to za polecenie? Czy ignoruje dowiązania symboliczne lub tworzy nowe? - co? –

+1

'a' to archiwum (zachowuje rzeczy),' v' verbose, 'h' czytelne dla człowieka wyjście,' e' określa usługę, z której chcesz skorzystać (w tym przypadku jest to 'ssh'). Przeczytaj więcej [tutaj] (https://linux.die.net/man/1/rsync) – tenCupMaximum

23

stwierdziliśmy, że the rsync method nie działa dla mnie, jednak znalazłem alternatywę, która nie działa na tej stronie (www.docstore.mik.ua/orelly). W szczególności sekcja 7.5.3 of "O'Reilly: SSH: The Secure Shell. The Definitive Guide".

7.5.3. Rekurencyjne Kopia Katalogi

...

Chociaż scp można skopiować katalogi, niekoniecznie jest to najlepsza metoda. Jeśli twój katalog zawiera twarde linki lub miękkie linki, nie będą one duplikowane. Linki są kopiowane jako zwykłe pliki (cele odsyłaczy), a co gorsza, katalogowe łącza powodują, że scp1 będzie pętlą w nieskończoność. (scp2 wykrywa dowiązania symboliczne i kopiuje ich cele.) Inne typy plików specjalnych, takich jak potoki nazwane, również nie są poprawnie kopiowane. Lepszym rozwiązaniem jest użycie tar, który obsługuje pliki specjalne poprawnie, i wysłanie go do zdalnego urządzenie podczas rozpakowany poprzez ssh:

$ tar cf - /usr/local/bin | ssh server.example.com tar xf - 
+1

Jest to dobra sugestia, jeśli rsync nie jest zainstalowany na zdalnym końcu lub (z niewielkimi modyfikacjami), jeśli zdarzy ci się już ma archiwum katalogu źródłowego. –

+0

Potrzebuje "p" (tar xpf), aby zachować uprawnienia w miejscu docelowym. –

12

Stosując tar na ssh zarówno jako nadajnik i odbiornik wystarcza również:

cd $DEST_DIR 
ssh [email protected] 'cd $REMOTE_SRC_DIR; tar cf - ./' | tar xvf - 
+0

Dodałem po stronie źródłowej '--one-file-system' i po stronie docelowej' p', aby zachować uprawnienia. – ceving

+0

strona man dla smoły mówi; --one-file-system = nie przekraczaj punktów montowania – AnneTheAgile

0

Jednym z rozwiązań jest stosowanie rury powłoki. Mam sytuację, w której dostałem trochę plików * .gz i dowiązań symbolicznych wygenerowanych przez niektóre programy, aby połączyć je z tymi samymi plikami * .gz z nieco krótszą nazwą. Jeśli po prostu używam scp, wówczas dowiązania symboliczne będą kopiowane jako zwykłe pliki i będą skutkować duplikatami. Wiem, że rsync może ignorować dowiązania symboliczne, ale moje pliki gz nie są kompresowane z opcją synchronizacji, a synchronizacja bardzo wolno kopiuje te pliki gz. Więc po prostu użyć następującego skryptu, aby skopiować pliki:

find . -type f -exec scp {} target_host:/directory/name/data \; 

Opcja -f znajdzie tylko zwykłe pliki i ignorować łączy symbolicznych. Musisz podać to polecenie na hoście źródłowym. Mam nadzieję, że może to pomóc niektórym użytkownikom w mojej sytuacji. Daj mi znać, jeśli coś przeoczyłem.