Come riprendere scp con file parzialmente copiati? [chiuso]


97

Uso il comando della shell scp per copiare un'enorme cartella di file.

Ma ad un certo punto del tempo ho dovuto uccidere il comando in esecuzione (con Ctrl + C o kill).

Per quanto ne so, scp ha copiato i file in sequenza, quindi dovrebbe esserci un solo file parzialmente copiato.

Come si può riprendere lo stesso comando scp per non sovrascrivere i file copiati con successo e per gestire correttamente i file parzialmente copiati?

PS So di poter fare questo genere di cose in rsync, ma scp è più veloce per me per qualche motivo e lo uso invece.


4
Sospetto che rsync sia più lento perché impiega un po 'di tempo in più a fare cose che ti permettono di riavviare un trasferimento. Potresti considerare di usare rsync per completare il trasferimento parziale.
Keith Thompson

2
Se vuoi essere intelligente, puoi sempre provare ddcon una skipvariabile appropriata e pipe a ssh:)
Mark Nunberg

1
Questo è fuori tema per SO. Appartiene a SuperUser, e in effetti è stato chiesto lì .
Dan Dascalescu

Risposte:


185

Dovresti usare rsyncoltressh

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

L'opzione chiave è -P, che è la stessa di--partial --progress

È possibile utilizzare anche altre opzioni, come -a(per la modalità di archiviazione) e -z(per abilitare la compressione).

Il manuale: https://download.samba.org/pub/rsync/rsync.html


43
Volevo solo notare che rsync riprenderà una copia batch iniziata con scp perfettamente.
Craig Anderson

6
Otterrai "la directory che salta". errore, a meno che non specifichi anche -r. Fonte: lucasb.eyer.be/snips/rsync-skipping-directory.html
Artur Czajka

4
Ha funzionato per me, ma ho aggiunto anche --append .... rsync -P --append -e ssh remoteuser @ remotehost: / remote / path / local / path
cnd

1
@ CraigAnderson questo è il punto importante che è stato tralasciato. La risposta sembra suggerire che il download dovrebbe essere iniziato con rsync per cominciare.
Willa

1
Le opzioni fornite nella risposta non hanno funzionato per me, ma questo ha funzionato:rsync -P -rsh remoteuser@remotehost:/remote/path /local/path
Bunny Rabbit

26

Un'alternativa a rsync:

Utilizzare sftpcon l'opzione -r(in modo ricorsivo copiare intere directory) e l'opzione -adi sftp's getcomando per riprendere i trasferimenti parziali di file esistenti.

Prerequisito: la tua sftpimplementazione ha già un'opzione getcon -a.

Esempio:

Copia la directory /foo/bardal server remoto alla directory corrente locale. La directory barverrà creata nella directory corrente locale.

echo "get -a /foo/bar" | sftp -r server

4
La tua soluzione è ottima perché il mio server non consente l'accesso in ssh, quindi rsync non funziona. Avevo bisogno di caricare invece di scaricare, quindi ecco il mio comando:echo "put -a foo/bar" | sftp -r server:/foo
Carlos Rafael Ramirez

1
Questa sembra un'opzione molto valida per riprendere file parzialmente scaricati, perché rsync non sembra essere molto compatibile con ssh (con porte non predefinite).
codezombie

11

A partire da OpenSSH 6.3, puoi usare il regetcomando in sftp.

Ha la stessa sintassi di get, tranne per il fatto che avvia un trasferimento dalla fine di un file locale esistente.


6

Un'altra possibilità è provare a salvare l'SCP che hai già avviato quando si blocca.

ctrl + z per passare in background e interromperlo, quindi passare al server ricevente e accedere, quindi uscire. Ora fg il processo scp e guardalo riprendere da "stallo"!


Ha funzionato per me su Mac OS X. Grazie per aver postato questo, mi ha salvato la pancetta oggi!
Ben Hitchcock

1

Quando anche rsync si blocca dopo un paio di secondi, quando inizialmente funzionava bene, sono finito con la seguente soluzione di forza bruta:

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

1

Puoi utilizzare il file -rsh-P opzioni e di rsync. -Pè per il download parziale e -rshindica che il trasferimento è finito ssh procotol.

Il comando completo sarebbe: rsync -P -rsh remoteuser@remotehost:/remote/path /local/path


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.