Jak wznowić scp z częściowo skopiowanymi plikami? [Zamknięte]

102

Używam polecenia powłoki scp, aby skopiować ogromny folder plików.

Ale w pewnym momencie musiałem zabić uruchomioną komendę (przez Ctrl + C lub kill).

Według mojego zrozumienia scp kopiował pliki sekwencyjnie, więc powinien być tylko jeden częściowo skopiowany plik.

W jaki sposób można wznowić to samo polecenie scp, aby nie nadpisywać pomyślnie skopiowanych plików i poprawnie obsługiwać częściowo skopiowane pliki?

PS Wiem, że mogę robić tego typu rzeczy w rsync, ale scp jest dla mnie szybszy z jakiegoś powodu i zamiast tego go używam.

Bohdan
źródło
4
Podejrzewam, że rsync działa wolniej, ponieważ spędza trochę więcej czasu na robieniu rzeczy, które pozwalają na ponowne uruchomienie transferu. Możesz rozważyć użycie rsync do zakończenia częściowego przesyłania.
Keith Thompson
2
Jeśli chcesz być sprytny, zawsze możesz spróbować ddz odpowiednią skipzmienną i fajką do ssh:)
Mark Nunberg
1
To nie jest tematem dla SO. Należy do SuperUser i rzeczywiście został tam zapytany .
Dan Dascalescu
rsync domyślnie używa ssh pod okładkami, Typically, rsync is configured to use ssh by defaultwięc ... powinno być mniej więcej tak samo szybkie (chociaż najpierw wyświetla katalog, co może dać wolniejszy start)
rogerdpack

Odpowiedzi:

192

Powinieneś użyć rsyncponadssh

rsync -P -e ssh remoteuser@remotehost:/remote/path /local/path

Kluczową opcją jest -Pto samo, co--partial --progress

Domyślnie rsync usunie każdy częściowo przesłany plik, jeśli transfer zostanie przerwany. W niektórych przypadkach bardziej pożądane jest przechowywanie częściowo przesłanych plików. Użycie opcji --partial mówi rsync, aby zachować plik częściowy, co powinno znacznie przyspieszyć transfer reszty pliku.

Można również użyć innych opcji, takich jak -a(dla trybu archiwizacji) i -z(aby włączyć kompresję).

Podręcznik: https://download.samba.org/pub/rsync/rsync.html

jordi
źródło
50
Chciałem tylko zauważyć, że rsync wznowi kopiowanie wsadowe rozpoczęte za pomocą scp.
Craig Anderson
6
Otrzymasz „pomijanie katalogu”. błąd, chyba że określisz również -r. Źródło: lucasb.eyer.be/snips/rsync-skipping-directory.html
Artur Czajka
4
Pracowałem dla mnie, ale dodałem --append też .... rsync -P --append -e ssh remoteuser @ remotehost: / remote / path / local / path
cnd
1
@CraigAnderson to ważna kwestia, która została pominięta. Odpowiedź brzmi tak, jakby sugerowała, że ​​pobieranie powinno rozpocząć się od rsync.
Willa
1
Opcje podane w odpowiedzi nie działały dla mnie, ale tak się stało:rsync -P -rsh remoteuser@remotehost:/remote/path /local/path
Bunny Rabbit
28

Alternatywa dla rsync:

Stosowanie sftpz opcją -r(rekursywnie kopiowania całych katalogów) oraz opcję -az sftp„s getpolecenia«wznowienie częściowych przesunięć istniejących plików».

Warunek wstępny: Twoja sftpimplementacja ma już opcję getwith -a.

Przykład:

Skopiuj katalog /foo/barze zdalnego serwera do lokalnego katalogu bieżącego. Katalog barzostanie utworzony w twoim lokalnym katalogu bieżącym.

echo "get -a /foo/bar" | sftp -r user@remote_server
Cyrus
źródło
5
Twoje rozwiązanie jest świetne, ponieważ mój serwer nie pozwala na logowanie przez ssh, więc rsync nie działa. Musiałem przesłać zamiast pobierać, więc oto moje polecenie:echo "put -a foo/bar" | sftp -r server:/foo
Carlos Rafael Ramirez
2
Wydaje się, że jest to bardzo użyteczna opcja wznawiania częściowo pobranych plików, ponieważ rsync nie wydaje się być zbyt przyjazny dla ssh (z portami innymi niż domyślne).
codezombie,
5

Inną możliwością jest próba uratowania SCP, który już zacząłeś, kiedy się zatrzymuje.

ctrl + z w tle i zatrzymaj je, następnie ssh na serwer odbierający i zaloguj się, a następnie zakończ. Teraz przeprowadź proces scp i zobacz, jak wznawia się od „utknięcia”!

Puckfist
źródło
Pracował dla mnie na Mac OS X. Dzięki za opublikowanie tego, uratowało mi to dziś bekon!
Ben Hitchcock
Kopnij tę sieć, aby zobaczyć, czy sama się
odrodzi
2

Kiedy rsync również zatrzymuje się po kilku sekundach, gdy początkowo działał dobrze, skończyło się na następującym rozwiązaniu brutalnej siły, aby rozpocząć i zatrzymać ponowne uruchamianie pobierania co 60 sekund:

cat run_me.sh
#!/bin/bash
while [ 1 ]
do
  rsync --partial --progress --rsh=ssh user@host:/path/file.tgz file.tgz &
  TASK_PID=$!
  sleep 60
  kill $TASK_PID
  sleep 2
done
remigiusz boguszewicz
źródło
1

Możesz skorzystać z opcji -rshi . jest do częściowego pobrania i-Prsync-P-rsh wskazuje, że przesyłanie zakończyło się ssh procotol.

Kompletne polecenie brzmiałoby: rsync -P -rsh remoteuser@remotehost:/remote/path /local/path

Królik
źródło
Tak samo jak odpowiedź Jordi?
rogerdpack
-4

Wczoraj dostałem ten sam problem, przenosząc ogromny zrzut sql przez scp, z którym miałem szczęście wget --continue the_url

Ten post na blogu dość dobrze to wyjaśnia http://www.cyberciti.biz/tips/wget-resume-broken-download.html w zasadzie:

wget --continue url
Arnaud Bouchot
źródło
Za najlepszą praktykę uważa się kopiowanie odpowiednich części z adresu URL do odpowiedzi na wypadek awarii witryny.
Ryre
Próbuję przesłać, więc nie ma co dla mnie.
Rolf