Czy można zmusić SCP do ignorowania dowiązań symbolicznych podczas kopiowania?

80

Muszę ponownie zainstalować jeden z serwerów ukazali, a jako środek ostrożności, I chce się przenieść /home, /etc, /opt, i /Servicesdo serwera zapasowego.

Mam jednak problem: z powodu dużej ilości dowiązań symbolicznych wiele plików jest kopiowanych wielokrotnie.

Czy można scpzignorować dowiązania symboliczne (a właściwie skopiować łącze jako łącze, a nie jako katalog lub plik)? Jeśli nie, czy jest inny sposób, aby to zrobić?

Kris_R
źródło

Odpowiedzi:

82

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/
Kris_R
źródło
1
Więc co to polecenie? Czy ignoruje dowiązania symboliczne lub tworzy nowe? -avhe?
Ernestas Stankevičius
3
ajest archiwum (zachowuje rzeczy), vszczegółowym, hczytelnym dla człowieka wyjściem, eokreśl usługę, której chcesz użyć (w tym przypadku jest to ssh). Przeczytaj więcej tutaj
quietContest
Dziękuję Ci. Stary serwer jest zablokowany. Nowy serwer potrzebował treści. Straciłem wszystkie miękkie linki, ale wiele z nich zostało zepsutych, więc teraz będzie to powolne zadanie konserwacyjne na nowym serwerze. Dzięki jeszcze raz.
jlettvin
1
--safe-links pozwala zachować linki, które są w katalogu i nie kopiować tych, które wskazują na zewnątrz.
Colin Pitrat
29

Okazało się, że metoda nie działa dla mnie, jednak znalazłem alternatywę, która nie działa na tej stronie ( www.docstore.mik.ua/orelly ).rsync

W szczególności sekcja 7.5.3 książki „O'Reilly: SSH: The Secure Shell. The Definitive Guide” .

7.5.3. Rekurencyjna kopia katalogów

...

Chociaż scp może kopiować katalogi, niekoniecznie jest to najlepsza metoda. Jeśli katalog zawiera twarde lub miękkie linki, nie zostaną one zduplikowane. Linki są kopiowane jako zwykłe pliki (cele linków), a co gorsza, cykliczne linki do katalogów powodują, że scp1 zapętla się w nieskończoność. (scp2 wykrywa dowiązania symboliczne i zamiast tego kopiuje ich cele). Inne typy plików specjalnych, takie jak nazwane potoki, również nie są poprawnie kopiowane Lepszym rozwiązaniem jest użycie tar, który poprawnie obsługuje pliki specjalne i wysłanie go do pilota maszyna do rozpakowania, przez SSH:

$ tar cf - /usr/local/bin | ssh server.example.com tar xf -
Łukasz
źródło
1
Jest to dobra sugestia, jeśli rsync nie jest zainstalowany na zdalnym końcu lub (z niewielkimi modyfikacjami), jeśli masz już archiwum z katalogiem źródłowym.
Trebor Rude
1
Potrzebuje "p" (tar xpf), aby zachować uprawnienia w miejscu docelowym.
Paul Lynch,
Uwaga: to polecenie należy uruchomić z komputera źródłowego , wypychając pliki do komputera docelowego . W moim przypadku (wiele małych, nieskompresowanych plików) działało lepiej i szybciej scplub rsync.
Gerardo Lima
Kolejne pytanie: czy po stronie źródłowej polecenie tar przechowuje dane archiwum najpierw lokalnie, przed przesłaniem ich do pilota? [Byłby to problem, gdy dysk źródłowy jest prawie pełny - powiedzmy w 98%]
Jungle Editor
18

Używanie tarover sshjako nadawcy i odbiorcy również działa:

cd $DEST_DIR
ssh user@remote-host 'cd $REMOTE_SRC_DIR; tar cf - ./' | tar xvf -
Vojtech Vitek
źródło
Dodałem po stronie źródłowej --one-file-systemi po stronie docelowej, paby zachować uprawnienia.
ceving
strona man dla tar mówi; --one-file-system = nie
krzyżuj
2

Jednym z rozwiązań jest użycie rury osłonowej. Mam sytuację, w której otrzymałem kilka plików * .gz i dowiązania symboliczne wygenerowane przez jakieś oprogramowanie do linków do tych samych plików * .gz o nieco krótszej nazwie. Jeśli po prostu użyję scp, dowiązania symboliczne zostaną skopiowane jako zwykłe pliki i dadzą duplikaty. Wiem, że rsync może ignorować dowiązania symboliczne, ale moje pliki gz nie są kompresowane z opcjami synchronizowanymi, a synchronizacja kopiuje te pliki gz bardzo wolno. Więc po prostu używam 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 zignoruje dowiązania symboliczne. Musisz wydać 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ś przegapiłem.

Kemin Zhou
źródło
0

Jedno liniowe rozwiązanie, które można uruchomić u klienta, aby skopiować folder z serwera za pomocą polecenia tar + ssh.

ssh user@<Server IP/link> 'mkdir -p <Remote destination directory;cd <Remote destination directory>; tar cf - ./' | tar xf - C <Source destination directory>

Uwaga: mkdir jest konieczny, jeśli nie ma zdalnego katalogu docelowego, polecenie po prostu skompresuje cały katalog główny zdalnego serwera i wyodrębni go do klienta.

Vinay Tiwary
źródło