Odpowiedzi:
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.
dd
przy małych rozmiarach bloków może być powolny (zaledwie 350 kB / s tutaj). Na szczęście scp
transfery 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 $sofar
wtedy musi być liczba 1024 bajtów bloków do pominięcia!)
rsys
w drugim wierszu jest tylko przykładowa nazwa hosta, a nie jakiś specjalny argument ssh
. Sugeruję zastąpienie go, user@host
aby uniknąć nieporozumień.
Z scp
nie
Jeśli oba końce go mają, możesz użyć rsync -LvzP remoteserver:path/to/file localfile
do przesłania jednego pliku.
Tak, istnieją sposoby wznowienia od momentu przerwania, ale nie jest to możliwe przy użyciu scp. sftp reget filename
robi 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
scp -o ConnectTimeout 60
Pozwala określić limit czasu połączenia. Może uchronić twoje połączenie przed zerwaniem.
Tak, jeśli oba końce obsługują sftp - po scp remoteuser@remotehost:/absolute/filename .
awarii możesz wznowić, wykonując, sftp remoteuser@remotehost
a następnie reget /absolute/filename
wznowić pobieranie.