Czy istnieje sposób na wznowienie przerwanego scp pliku?

12

Od czasu do czasu pobieram bardzo duży plik przez scp i za każdym razem istnieje małe prawdopodobieństwo, że połączenie zostanie przerwane i odcięte w połowie transferu.

Czy istnieje sposób, aby go wznowić?

GJ
źródło

Odpowiedzi:

9

Możesz wypróbować następującą metodę: zamiast scp użyj dd, aby pominąć pobraną część i dołączyć resztę do pliku.

sofar=`ls -l ./destfile | awk '{print $5}'`
ssh rsys "dd if=./srcfile bs=1 skip=$sofar" >> ./destfile

Możliwa optymalizacja: praca z dużymi blokami. Zostawmy to jako zadanie domowe.

szarpać
źródło
Nie przetestowałem tego jeszcze, ale wstępnie przyjmuję odpowiedź, ponieważ użycie dd brzmi jak świetne podejście do rozwiązania.
GJ.
Właśnie to przetestowałem, działa idealnie, dziękuję!
Kossak,
@Kossak, miło to słyszeć!
yrk
ddprzy małych rozmiarach bloków może być powolny (zaledwie 350 kB / s tutaj). Na szczęście scptransfery wydają się mieć 1024 bajty bloków. Jeśli więc do pliku (lub innego, przez odcięcie go do najbliższego bloku 1024 bajtów), można ją przyspieszyć tak: ssh rsys "dd if=./srcfile bs=1024 skip=$sofar" >> ./destfile. (Zauważ, że $sofarwtedy musi być liczba 1024 bajtów bloków do pominięcia!)
Tanius
2
Zajęło mi trochę czasu, zanim zdałem sobie sprawę, że rsysw drugim wierszu jest tylko przykładowa nazwa hosta, a nie jakiś specjalny argument ssh. Sugeruję zastąpienie go, user@hostaby uniknąć nieporozumień.
Ahmed Essam
7

Z scpnie

Jeśli oba końce go mają, możesz użyć rsync -LvzP remoteserver:path/to/file localfiledo przesłania jednego pliku.

użytkownik1686
źródło
Dzięki temu zaoszczędziłem godziny pobierania ogromnego pliku, który został przerwany. Dziękuję Ci.
phette23
3

Tak, istnieją sposoby wznowienia od momentu przerwania, ale nie jest to możliwe przy użyciu scp. sftp reget filenamerobi to, czego potrzebujesz. Yarek i Grawity dostarczyli prawidłowe rozwiązania, które dałem +1 dla obu, ale dla wznowienia od momentu przerwy lubię rsync. Podane przykładowe polecenia zakładają, że pobierasz plik ze zdalnego serwera na lokalną stację roboczą (pobieranie). Należy pamiętać, że dwa ostatnie parametry należy traktować jako plik_źródłowy i plik_docelowy w tej kolejności. Składnia nazwy pliku różni się w zależności od tego, czy plik źródłowy czy docelowy jest lokalny czy zdalny. Gdybym wysyłał (ładował) pliki [tekstowe], przepisałbym przykłady podane jako:

# Od lokalnego do zdalnego
sofar = `ssh system_zdalny ls -l plik przerwany | awk '{print 5 $}' ';
dd if = plik_źródłowy bs = 1 skip = $ sofar | ssh remote_system "cat >> ./interrupt_file"

I do rozwiązania rsync, dodaję -e ssh. Powinieneś zastanowić się, czy potrzebujesz gadatliwości, kompresji, zachowania własności, uprawnień, znacznika czasu, katalogów cyklicznych itp. Sprawdź strony podręcznika i Google, jeśli chodzi o parametr -L. Możesz chcieć, aby dowiązania symboliczne pozostały jako linki zamiast odwoływania się do nich.

rsync -P -e ssh local_source_file remoteserver:path/to/interrupted_target_file

Daniel Liston
źródło
1

Nie ma innego rozwiązania (oprócz rsynclub ddrozwiązania podane tutaj), które jestem zaskoczony nikt wymienić: to jest reputrozkaz sftp.

knocte
źródło
0
scp -o ConnectTimeout 60

Pozwala określić limit czasu połączenia. Może uchronić twoje połączenie przed zerwaniem.

użytkownik1055604
źródło
0

Tak, jeśli oba końce obsługują sftp - po scp remoteuser@remotehost:/absolute/filename .awarii możesz wznowić, wykonując, sftp remoteuser@remotehosta następnie reget /absolute/filenamewznowić pobieranie.

Jason Drane
źródło