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.
dd
z odpowiedniąskip
zmienną i fajką dossh
:)Typically, rsync is configured to use ssh by default
więc ... powinno być mniej więcej tak samo szybkie (chociaż najpierw wyświetla katalog, co może dać wolniejszy start)Odpowiedzi:
Powinieneś użyć
rsync
ponadssh
rsync -P -e ssh remoteuser@remotehost:/remote/path /local/path
Kluczową opcją jest
-P
to samo, co--partial --progress
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
źródło
-r
. Źródło: lucasb.eyer.be/snips/rsync-skipping-directory.htmlrsync -P -rsh remoteuser@remotehost:/remote/path /local/path
Alternatywa dla rsync:
Stosowanie
sftp
z opcją-r
(rekursywnie kopiowania całych katalogów) oraz opcję-a
zsftp
„sget
polecenia«wznowienie częściowych przesunięć istniejących plików».Warunek wstępny: Twoja
sftp
implementacja ma już opcjęget
with-a
.Przykład:
Skopiuj katalog
/foo/bar
ze zdalnego serwera do lokalnego katalogu bieżącego. Katalogbar
zostanie utworzony w twoim lokalnym katalogu bieżącym.echo "get -a /foo/bar" | sftp -r user@remote_server
źródło
echo "put -a foo/bar" | sftp -r server:/foo
Od OpenSSH 6.3 możesz używać
reget
polecenia wsftp
.Ma taką samą składnię jak the
get
, z tą różnicą, że rozpoczyna transfer od końca istniejącego pliku lokalnego.echo "reget /file/path" | sftp -r user@server_name
Ten sam efekt ma
-a
przełączenie naget
polecenie lub globalny-a
przełącznik wiersza poleceń w `sftp .źródło
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”!
źródło
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
źródło
Możesz skorzystać z opcji
-rsh
i . jest do częściowego pobrania i-P
rsync
-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
źródło
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
źródło